在多執行緒程式的設計中,最難處理就是各執行緒之間的耦合關係,所以jdk提供了很多用於解耦的類,例如blockingqueue、blockingdeque等,這些類的特點是既可以適用於消費者/生產者模式,還可以適用於消費者與生產者混合模式。
今天介紹的exchanger除了在資料交換方面表現得非常優秀之外,還能協調執行緒的執行進度,而且是多個執行緒(並沒有一對一之間的關係)之間的進度,所有特別適用於分發任務,下面給出乙個最簡單的**示例:
static class consumer implements runnable
public
void
run()
}} catch (interruptedexception e)
}}
主函式**如下:
public
static
void
main(string args)
最後輸出結果如下:
收到偶數:0
收到奇數:1
但出現了乙個問題,執行緒無法終結,一直處於執行狀態,這是因為偶數比奇數多乙個,導致偶數交換執行緒一直在等待消費執行緒,解決辦法有兩種:
1. 雙方的數量保持一致;
2. 在資料交換時加上時間限制,如下:
int result = exchanger.exchange(i, 3, timeunit.seconds);
exchanger除了能交換資料,還能協調執行緒的執行進度,並且能協調多個執行緒的進度與資料交換(網上的很多文章都說exchanger只能處理兩個執行緒間的資料交換,完全是錯誤的說法)。 併發工具類 Exchanger
exchanger是特別容易理解的乙個工具類,它可以在兩個執行緒之間交換資料,只能是2個執行緒,他不支援更多的執行緒之間互換資料。當執行緒1呼叫exchange物件的exchange 方法後,他會陷入阻塞狀態,直到執行緒2也呼叫了exchange 方法,然後以執行緒安全的方式交換資料,之後執行緒a和...
java併發程式設計之Exchanger
exchanger v 可以交換的物件型別 可以在對中對元素進行配對和交換的執行緒的同步點。每個執行緒將條目上的某個方法呈現給 exchange 方法,與夥伴執行緒進行匹配,並且在返回時接收其夥伴的物件。exchanger 可能被視為 synchronousqueue 的雙向形式。exchanger...
併發工具類之 Exchanger
exchanger 交換者 是乙個用於執行緒間協作的工具類。exchanger 用於進行執行緒間的資料交換。兩個執行緒通過exchange 方法交換資料,第乙個執行緒執行到exchange 方法後會一直等待第二個執行緒也執行exchange 方法,當兩個執行緒都到達同步點後,這兩個執行緒就可以交換資...