並發基礎(九) java線程的終止與中斷
阿新 • • 發佈:2018-03-01
建議 暫停 boolean read 便是 -m java sin 修飾符
1、簡單了解一下:為何不贊成使用 Thread.stop、Thread.suspend 和 Thread.resume?
??suspend 、resume、stop方法分別完成了線程的暫停、恢復、終止的工作。不建議使用原因:是因為這三個方法帶來的副作用,如suspend( )方法,調用後,線程就會一直占用資源睡眠,直到調用resume( )恢復後,才可以運行。這樣很容易引發死鎖。同樣,stop( )方法在終結一個線程時不會保證線程的資源正常釋放,因此會導致程序可能工作在不確定的狀態下。
??線程的暫停、恢復操作可以用 等待/通知 機制來替代。但線程的終止就要用戶去實現了。
詳細可參考:http://bjzhkuang.iteye.com/blog/1748396
2、如何優雅安全地終止線程
??終止一個線程 本質上就是線程間的通信交互的過程。因此,線程間的通信方式:共享變量、流、中斷都可以用來實現終止線程的機制。最常用的方式便是“中斷”;
下面的例子是:除了中斷,還可利用boolean變量來控制是否需要終止線程;
public class ThreadTest{
public static void main(String[] args) throws InterruptedException {
MyTask taskOne = new MyTask();
Thread threadOne = new Thread(taskOne,"threadOne" );
threadOne.start();
TimeUnit.MILLISECONDS.sleep(500);
threadOne.interrupt();
MyTask taskTwo = new MyTask();
Thread threadTwo = new Thread(taskTwo,"threadTwo");
threadTwo.start();
TimeUnit.MILLISECONDS.sleep(500);
taskTwo.cancel();
}
private static class MyTask implements Runnable{
//要加上volatile 修飾符,保證內存的可見性,及時更新變量值
private volatile boolean on = true;
private long i;
@Override
public void run() {
//調用cancel、或者中斷都可以終止線程
while(on && !Thread.currentThread().isInterrupted()){
i++;
}
System.out.println("線程"+Thread.currentThread().getName()+" Count i = "+i);
}
public void cancel(){
on = false;
}
}
}
運行結果:
線程threadOne Count i = 239418320
線程threadTwo Count i = 235374425
並發基礎(九) java線程的終止與中斷