使用暴力的方式结束线程

思路

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));
    }
}

猜你喜欢

转载自www.cnblogs.com/zheaven/p/12054044.html