1. 程式人生 > >並發基礎(九) java線程的終止與中斷

並發基礎(九) java線程的終止與中斷

建議 暫停 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線程的終止與中斷