本文目錄一覽:
Java里如何暫停一個線程,達到一定條件後又喚醒線程?
thread1{
run() {
synchronized(obj) {
while(條件1不滿足)obj.wait();
//下面寫滿足後的操作
}
}
}
//線程2中將條件1滿足,然後喚醒線程1
thread2{
run() {
synchronized(obj) {
//使條件1滿足
obj.notifyAll();
}
}
}
obj一定要是對同一個對象的引用
java多線程暫停
由於java廢棄了suspend和resume,所以目前來看使用Thread類貌似沒有不修改線程的執行體而從外部暫停線程的方法,javadoc裏面推薦的方法是在外部通過某種方法把暫停和恢復的要求通知給線程對象,比如用public屬性,然後由線程的執行體自己隔一段時間進行一次自主判斷,如果需要暫停就用wait或者sleep或者某些其他的方法暫停,而恢復運行的話根據暫停的方法不同有不同的選擇,比如用wait暫停可以用notify恢復運行,用sleep則等待時間到,或者可以用interrupt恢復。
而yield的話我覺得可能不能達到目的,首先yield本身也是必須由線程執行體自主執行,而不是線程外部執行的,然後yield照我的理解是讓線程暫時離開運行狀態但並不阻塞,而是進入就緒狀態等待下一次調度,所以並不能保證線程暫停,當然yield本身執行之後因為沒有阻塞所以並不需要顯式的恢復。
如果你的線程執行體裏面是循環的話,好寫一些,只要每次循環的時候檢測暫停或者恢復的外部要求就行了,不過如果是順序執行,可能只有每隔一段就插入一次檢測了。
當然也可以找找Thread類之外的方法。
JAVA中如何控制線程的啟動與暫停
線程的狀態表示線程正在進行的活動以及在此時間段內所能完成的任務.線程有創建,可運行,運行中,阻塞,死亡五中狀態.一個具有生命的線程,總是處於這五種狀態之一:
1.創建狀態
使用new運算符創建一個線程後,該線程僅僅是一個空對象,系統沒有分配資源,稱該線程處於創建狀態(new thread)
2.可運行狀態
使用start()方法啟動一個線程後,系統為該線程分配了除CPU外的所需資源,使該線程處於可運行狀態(Runnable)
3.運行中狀態
Java運行系統通過調度選中一個Runnable的線程,使其佔有CPU並轉為運行中狀態(Running).此時,系統真正執行線程的run()方法.
4.阻塞狀態
一個正在運行的線程因某種原因不能繼續運行時,進入阻塞狀態(Blocked)
5.死亡狀態
線程結束後是死亡狀態(Dead)
創建線程和啟動線程並不相同,在一個線程對新線程的Thread對象調用start()方法之前,這個新線程並沒有真正開始執行。Thread對象在其線程真正啟動之前就已經存在了,而且其線程退出之後仍然存在。這可以讓您控制或獲取關於已創建的線程的信息,即使線程還沒有啟動或已經完成了。
通常在構造器中通過start()啟動線程並不是好主意。這樣做,會把部分構造的對象暴露給新的線程。如果對象擁有一個線程,那麼它應該提供一個啟動該線程的start()或init()方法,而不是從構造器中啟動它。
結束Java線程
Java線程會以以下三種方式之一結束:
Java線程到達其run()方法的末尾。
Java線程拋出一個未捕獲到的Exception或Error。
另一個Java線程調用一個棄用的stop()方法。棄用是指這些方法仍然存在,但是您不應該在新代碼中使用它們,並且應該盡量從現有代碼中除去它們。
當Java程序中的所有線程都完成時,程序就退出了。
java如何實現線程的啟動和暫停
Thread thread = new Thread(obj);
thread.start();//開始
thread .sleep(30000);//暫停
thread.stop();//停止
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/247064.html