標籤:com test body stop throws str 本質 ide 就是
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線程的終止與中斷