問題——昨天被問到了一個具體的問題,大體是這樣的:一個構建工具,在構建過程當中,主要業務處理邏輯由不少的子線程去執行(嗯,大體是這個意思),而後如今客戶提出了一個需求,就是要暫停構建,而是否暫停時另外一個子線程去配置文件或者數據庫讀的,而後就須要暫停或者恢復其餘執行的線程。java
首先想到的是將全部子線程放到線程組中去,方便管理,而後再每一個線程中去設置一個標誌flag,來調用監視器對象的wait方法來暫停線程,可是立馬就發現問題了
數據庫
public void run() { synchronized (control) { while (true) { if(flag){ try { control.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } doingSomething(); //這裏是這個線程處理業務邏輯的地方 //可是若是在這裏阻塞了,就沒法到判斷是否暫停的邏輯上去 //因此這個暫停不是實時的 } } }
因此若是要調用wait和標誌位的方法來中斷線程的話,確定不是實時的,有可能業務已經處理完了,你的wait也就沒有意義了。函數
可是wait 會釋放對象的鎖,可是suspend()方法不會釋放所持有對象的鎖(監視器),例如若是在doingSomething()中持有System.out對象的鎖,而後其餘線程想打印寫什麼,就會產生阻塞,最壞的結果就是死鎖。工具
Thread.suspend()方法是java調用系統方法掛起線程,一樣resume()也是調用系統的方法恢復線程spa
因此想要作到實時暫停線程和恢復線程,就須要調用Thread的suspend()和resume()兩個函數,可是要很好的分析業務邏輯中持有的對象,是否是其餘未暫停線程也要訪問的,避免引起死鎖或者阻塞。線程