概念
当一个线程正常结束,或者因被打断而结束,或者因出现异常而结束时,我们需要考虑 如何同时释放线程中资源,比如文件句柄、 Socket 套接字句柄、数据库连接等比较稀缺的 资源。 Two Phase Termination 设计模式可以帮助我们实现,如图所示。
如图所示,我们使用“作业中”表示线程的执行状态,当希望结束这个线程时,发出线 程结束请求,接下来线程不会立即结束,而是会执行相应的资源释放动作直到真正的结束, 在终止处理状态时,线程虽然还在运行,但是进行的是终止处理工作,因此终止处理又称为 线程结束的第二个阶段,而受理终止要求则被称为线程结束的第一个阶段。
在进行线程两阶段终结的时候需要考虑如下几个问题。
- 第二阶段的终止保证安全性,比如涉及对共享资源的操作。
- 要百分之百地确保线程结東,假设在第二个阶段出现了死循环、阻塞等异常导致无法结束。
- 对资源的释放时间要控制在一个可控的范围之内。
代码展示:
public class CounterIncrement extends Thread{
private volatile boolean terminated = false;
private int counter = 0;
@Override
public void run() {
try {
while(!terminated){
System.out.println(Thread.currentThread().getName()+" "+counter++);
TimeUnit.MILLISECONDS.sleep(ThreadLocalRandom.current().nextInt(1000));
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//第二阶段工作
this.clean();
}
}
public void clean(){
System.out.println("第二阶段工作");
}
public void close(){
this.terminated = true;
this.interrupt();
}
}