zoukankan      html  css  js  c++  java
  • 多线程08.优雅结束线程的三种方式

    1.使用flag

    public class ThreadCloseGraceful {
    
        private static class Worker extends Thread {
            private volatile boolean start = true;
    
            @Override
            public void run() {
                while (start) {
                    //
                }
            }
    
            public void shutdown() {
                this.start = false;
            }
        }
    
        public static void main(String[] args) {
            Worker worker = new Worker();
            worker.start();
    
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            worker.shutdown();
        }
    }

    2.使用线程中断方法结束

    public class ThreadCloseGraceful2 {
        private static class Worker extends Thread {
    
            @Override
            public void run() {
                while (true) {
                    if (Thread.interrupted())
                        break;
                }
                //-------------
                //-------------
                //-------------
            }
        }
    
        public static void main(String[] args) {
            Worker worker = new Worker();
            worker.start();
    
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            worker.interrupt();
        }
    }

    3.使用守护线程结束

    public class ThreadService {
    
        private Thread executeThread;
    
        private boolean finished = false;
    
        public void execute(Runnable task) {
            executeThread = new Thread() {
                @Override
                public void run() {
                    Thread runner = new Thread(task);
                    runner.setDaemon(true);
    
                    runner.start();
                    try {
                        runner.join();
                        finished = true;
                    } catch (InterruptedException e) {
                        //e.printStackTrace();
                    }
                }
            };
    
            executeThread.start();
        }
    
        public void shutdown(long mills) {
            long currentTime = System.currentTimeMillis();
            while (!finished) {
                if ((System.currentTimeMillis() - currentTime) >= mills) {
                    System.out.println("任务超时,需要结束他!");
                    executeThread.interrupt();
                    break;
                }
    
                try {
                    executeThread.sleep(1);
                } catch (InterruptedException e) {
                    System.out.println("执行线程被打断!");
                    break;
                }
            }
    
            finished = false;
        }
    }

    测试:

    public class ThreadCloseForce {
    
    
        public static void main(String[] args) {
    
            ThreadService service = new ThreadService();
            long start = System.currentTimeMillis();
            service.execute(() -> {
                //load a very heavy resource.
                /*while (true) {
    
                }*/
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            service.shutdown(10000);
            long end = System.currentTimeMillis();
            System.out.println(end - start);
        }
    }
  • 相关阅读:
    docker 容器与主机之间的数据copy
    vim 中如何快速注释和取消注释
    java查找字符中的某个内容并替换
    linux正则表达式
    数据流重定向与管道命令
    linux杂七杂八
    linux变量
    redis常用命令操作
    redis基本操作介绍
    redis数据结构
  • 原文地址:https://www.cnblogs.com/q1359720840/p/10653835.html
Copyright © 2011-2022 走看看