zoukankan      html  css  js  c++  java
  • 使用暴力的方式结束线程

    思路

    1.首先在一个类中创建一个执行线程,

    2.重写该执行线程的run()方法时创建一个新线程作为该执行线程的子线程

    3.子线程.setDaemon(true)设置子线程为守护线程,确保执行线程结束时子线程随之结束

    4.子线程.join()保证正常情况下子线程业务逻辑执行完成之后执行线程才死亡

    5.当 子线程.join() 被 执行线程.inrerrupt() 打断时,执行线程结束,子线程随之结束

    业务代码部分

    package com.dwz.concurrency.chapter6;
    
    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) {
                long shutdownRunnedTime = System.currentTimeMillis() - currentTime;
                if(shutdownRunnedTime > mills) {
                    System.out.println("任务超时,需要结束它");
                    executeThread.interrupt();
                    break;
                }
                
                try {
                    executeThread.sleep(1);
                } catch (InterruptedException e) {
                    System.err.println("执行线程被打断");
                    break;
                }
            }
            finished = false;
        }
    }

    测试代码部分

    package com.dwz.concurrency.chapter6;
    
    public class ThreadCloseForce {
        public static void main(String[] args) {
            long start = System.currentTimeMillis();
            ThreadService ts = new ThreadService();
            ts.execute(()->{
                //load a very heavy resource
                while (true) {
                    
                }
            });
            ts.shutdown(10000);
            long end = System.currentTimeMillis();
            System.out.println("实际运行时间:" + (end - start));
        }
    }
  • 相关阅读:
    Java-16 常用包装类
    Java-15 String类
    flask实现web端微信登录
    Flask-excel导出数据
    Java-14 单例模式
    Java-13 接口
    Java-12 抽象类
    结对项目:一个自动生成小学四则运算题目的命令行程序(c++)
    软工作业:第一次个人项目作业
    操作系统笔记一:操作系统引论
  • 原文地址:https://www.cnblogs.com/zheaven/p/12054044.html
Copyright © 2011-2022 走看看