一 Two-Phase Termination Patternjava
Two-Phase Termination Pattern,指的就是当但愿结束一个线程的时候,送出一个终止请求,可是不会立刻中止,作一些刷新工做。进入“终止处理中”,在该状态下,不会进行该线程平常工做任务的操做,而是进行一些终止操做。安全
这个方式所考虑的因素以下:架构
1,必需要考虑到使得该线程可以安全的结束,Thread中的stop会有问题的,由于它会无论线程执行到哪里,都会立刻中止,不能保证安全的结束。ide
2,必定可以进行正常的终止处理,在java中,这点可使用finally来实现spa
3,可以高响应的终止,收到终止后,当线程在wait或者sleep或者join的时候,不用等到时间到才终止,而是立刻中断线程的这些状态,进而进行终止操做。线程
当一个线程正在执行周期性的工做时候,在“做业中”发了中止执行绪的请求,此时该线程不能立刻离开中止,而应该先作完本次周期内部的工做,而后进入“善后阶段”完成一些善后的工做,所谓的两阶段终止,即停止“运做阶段”,并完成“善后阶段”,完整的完成执行绪的工做。内存
两阶段终止线程的架构模式以下:同步
public class WorkerTerminalThread extends Thread { // 已经送出终止请求为true,初始化的时候为false //因为该字段可能会被多个线程访问修改,为了保护就使用这个 private volatile boolean shutdownRequested = false; // 终止请求 public void shutdownRequest() { shutdownRequested = true; interrupt(); } public boolean isShutdownRequest() { return shutdownRequested; } // 具体动做 public final void run() { try { while (!shutdownRequested) doWork(); } catch (InterruptedException e) { } // 终止处理中的工做,不会进行日常操做,可是会进行终止处理 finally { doShutdown(); } } // 具体工做操做 private void doWork() throws InterruptedException { } // 终止后进行善后处理 private void doShutdown() { } }
解释:it
1,利用Volatile的缘由是,这个字段可能会被多个线程所使用,进行修改,为了保护该字段,则能够利用同步方法或者同步代码块来保护,或者利用Volatile。用Volatile修饰的字段,强制了该成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。并且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任什么时候刻,两个不一样的线程老是看到某个成员变量的同一个值。io
2,这里运用了标识和中断状态来终止线程,之因此不单独用一个。缘由是若是仅仅利用标识,没法是的那些处于wait、sleep或者join中的线程立刻中止,响应性就会不好。加入了interrupt后,就能够马上使得这些状态下的线程中断。若是仅仅利用interrupt,因为interrupt仅仅对于wait,sleep或join处进行抛出异常,若是工做代码执行在catch里,捕获了InterruptedException后,则此时interrupt就不起做用了。