java線程的暫停和恢復 suspend 和resume

    問題——昨天被問到了一個具體的問題,大體是這樣的:一個構建工具,在構建過程當中,主要業務處理邏輯由不少的子線程去執行(嗯,大體是這個意思),而後如今客戶提出了一個需求,就是要暫停構建,而是否暫停時另外一個子線程去配置文件或者數據庫讀的,而後就須要暫停或者恢復其餘執行的線程。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()兩個函數,可是要很好的分析業務邏輯中持有的對象,是否是其餘未暫停線程也要訪問的,避免引起死鎖或者阻塞。線程

相關文章
相關標籤/搜索