天天看點

java多線程程式設計——同步器Exchanger(四)

類java.util.concurrent.Exchanger提供了一個同步點,在這個同步點,一對線程可以交換資料。每個線程通過exchange()方法的入口提供資料給他的夥伴線程,并接收他的夥伴線程提供的資料,并傳回。

當在運作不對稱的活動時很有用,比如當一個線程填充了buffer,另一個線程從buffer中消費資料的時候,這兩個線程可以用Exchanger來交換資料。當兩個線程通過Exchanger交換資料的時候,這個交換對于兩個線程來說是線程安全的。兩個線程都會等到自己的程式運作到Exchanger這個地方時,進行等待。然後再進行資料交換,交換完畢後,各自進行以後的程式流程。

以下這個程式demo要做的事情就是生産者在交換前生産5個"生産者",然後再與消費者交換5個資料,然後再生産5個"交換後生産者",而消費者要在交換前消費5個"消費者",然後再與生産者交換5個資料,然後再消費5個"交換後消費者"。

執行結果

[list]

生産者開始運作

開始生産資料

生産了第1個資料,耗時1秒

消費者開始運作

開始消費資料

消費了第1個資料

消費了第2個資料

消費了第3個資料

消費了第4個資料

消費了第5個資料

消費資料結束

開始與生産者交換資料

生産了第2個資料,耗時1秒

生産了第3個資料,耗時1秒

生産了第4個資料,耗時1秒

生産了第5個資料,耗時1秒

生産資料結束

開始與消費者交換資料

消費者與生産者交換資料後,再消費資料

交換後消費了第6個資料

結束與消費者交換資料

生産者與消費者交換資料後,再生産資料

交換後生産了第6個資料,耗時1秒

交換後消費了第7個資料

交換後生産了第7個資料,耗時1秒

交換後消費了第8個資料

交換後生産了第8個資料,耗時1秒

交換後消費了第9個資料

交換後生産了第9個資料,耗時1秒

開始周遊消費者交換後的資料

生産者1

生産者2

生産者3

生産者4

生産者5

交換後消費者6

開始周遊生産者交換後的資料

交換後消費者7

交換後消費者8

消費者1

交換後消費者9

消費者2

消費者3

消費者4

消費者5

交換後生産者6

交換後生産者7

交換後生産者8

交換後生産者9

[/list]