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