Thread.stop方法可以停止一个线程,但并不优雅,此处的优雅的意思可以理解成线程安全或者做来一些善后的操作或者中止的操作,在《多线程设计模式》这本书中介绍了一种设计模式---两阶段终止模式,两阶段终止模式包含两个阶段:1.准备终止阶段
2.终止阶段。示例代码如下
public class TerminalThread extends Thread { private long num=0; private volatile boolean shutdown=false; public void terminal(){ this.shutdown=true; this.interrupt(); } @Override public void run(){ try{ while(!shutdown){ doWork(); } }catch (Exception e){ }finally { doShutdown(); } } private void doShutdown() { System.out.println("doShutdown: Save result"); System.out.println("doShutdown result: num = " + num); System.out.println("doShutdown: Save END"); } private void doWork() { num++; System.out.println("num: = " + num); try { Thread.sleep(5000); } catch (InterruptedException e) { } } }
两阶段终止模式的核心思想是设置一个标志位,需要声明为volatile,以保证多线程下的可见行,然后在run方法里面判断这个标志位,但是如果仅这样做还无法终止那些调用了wait,sleep方法的阻塞线程。所以要通过 interupt 方法来抛出异常来退出阻塞状态。