同步模式解決的是乙個執行緒需要等待另乙個執行緒的執行結果。
建立乙個類用來儲存結果,作為溝通兩個執行緒的橋梁
private object response;
private
final object lock =
newobject()
;// 得到返回的結果
public object get()
catch
(interruptedexception e)
}return response;}}
//設定結果
public
void
complete
(object response)
}
應用:
public
static
void
main
(string[
] args)
catch
(ioexception e)})
.start()
; log.
debug
("waiting...");
// 主線程阻塞等待
object response = guardedobject.
get();
log.
debug
("get response: [{}] lines",(
(list
) response)
.size()
);}
獲得結果是一直等待的,如果沒有結果就一直等待,可以優化成等待一段時間,如果還沒有結果就不等了。
public object get
(long millis)
", waittime);if
(waittime <=0)
trycatch
(interruptedexception e)
// 3) 如果提前被喚醒,這時已經經歷的時間假設為 400
timepassed = system.
currenttimemillis()
- begin;
log.
debug
("timepassed: {}, object is null {}"
, timepassed, response == null);}
return response;
}}
看一些thread.join()方法的原始碼。
public
final
synchronized
void
join
(long millis)
throws interruptedexception
if(millis ==0)
}else
wait
(delay)
; now = system.
currenttimemillis()
- base;}}
}
object.wait()和thread.join()join()的底層確實是wait(),wait()也確實釋放鎖,但是釋放的是thread的物件鎖也就可以這麼說
synchronized
(obj)
synchronized
(thread)
模擬乙個阻塞佇列
class
messagequeue
public message take()
catch
(interruptedexception e)
} message message = queue.
removefirst()
; queue.
notifyall()
;return message;}}
public
void
put(message message)
catch
(interruptedexception e)
} queue.
addlast
(message)
; queue.
notifyall()
;}}}
多執行緒設計中的設計模式
中午吃過飯回來閒著沒事,忽然想起多執行緒,開啟網頁隨便看了下,發現多執行緒的實現實際就是用模板方法 裝飾者兩種模式設計的。模板方法模式定義 在乙個類中定義乙個演算法,但將此演算法的某些細節留到子類中去實現.換句話說,基類是乙個抽象類,那麼你就是在使用一種簡單形式的摸板模式。裝飾者模式定義 裝飾者模式...
多執行緒中的設計模式(Future模式)
future模式 給你個引用 你在通過這個引用去獲取資料。給你個鑰匙,自己去拿 其中客戶端實際使用時,採用執行緒等待形式,當other call 執行完成後,喚醒客戶端請求。futureclient public class futureclient start return futuredata ...
設計模式和執行緒設計模式
volatile 可見性和順序性,不保證原子性 單例模式 監控執行緒生命週期的observable 採用乙個observable介面來獲取任務執行的狀態,主要想法是重寫run方法。在任務建立,開始,結束,錯誤時介入乙個方法,用來進行處理。同時維護乙個指示任務狀態的類變數。採用模板設計模式的方式,將具...