Exchanger 執行緒間的資料交換 交換器

2021-10-01 12:55:53 字數 2349 閱讀 5268

從jdk1.5版本開始開始提供執行緒間資料交換的功能,該功能可以通過exchanger類完成。

exchanger 類 定義:

public class exchangerextends object

引數v 表示要交換的資料型別。

該類從object類繼承,它提供了乙個同步點,在該同步點上線程可以交換資料,乙個執行緒通過exchange() 方法將其資料提給另乙個執行緒,並接收另乙個執行緒的資料。     

方法 exchange()定義的形式如下:

v exchange(v x)

該方法將等待另乙個執行緒到達交換點,然後交換指定的資料x,該方法將返回交換後的資料。

demo 示例:

使用exchanger 模擬實現生產者消費者問題。

問題分析:

設定兩個緩衝區,包括空緩衝區和滿緩衝區,空緩衝區分配給生產者,用於向其中存放資料,滿緩衝區分配給消費者,用於從其中取出資料消費。當生產者將空緩衝區裝滿,並且消費者將滿緩衝區取空後,生產者和消費者的緩衝區交換,

然後生產者繼續存放資料,消費者繼續取出資料,這樣迴圈往復進行。

//緩衝區類

public class databuffer

//生產資料

public void full()

}//消費資料

public void empty()

}//是否滿

public boolean isfull()else

}//是否空

public boolean isempty()

//放入資料

public void add()

//取出資料

public void take()

}//定義執行緒類emptyingbuffer,用於清空緩衝區

public class  emptyingbuffer extends thread

};public emptyingbuffer(databuffer buffer,exchangerexchanger)

public void run()

buffer.take();

if(buffer.isempty())

}}catch(interruptedexception e)}}

//定義執行緒類fullingbuffer,用於放入資料

public class fillingbuffer extends thread

};public fillingbuffer(databuffer buffer,exchangerexchanger)

public void run()

buffer.add();

if(buffer.isfull())

}    

}catch(interruptedexception e)

}    

}//測試啟動類

public class index

}執行結果:

thread-0------生產線程》的緩衝已空,開始放入!

thread-0------生產線程》的緩衝區已滿,等待交換資料!

thread-0------生產線程》資料交換完成!

thread-0------生產線程》的緩衝已空,開始放入!

thread-1------消費執行緒》資料交換完成!

thread-1------消費執行緒》的緩衝區已滿,開始消費!

thread-0------生產線程》的緩衝區已滿,等待交換資料!

thread-1------消費執行緒》的緩衝區已清空,等待互動資料!

thread-1------消費執行緒》資料交換完成!

thread-1------消費執行緒》的緩衝區已滿,開始消費!

thread-1------消費執行緒》的緩衝區已清空,等待互動資料!

thread-0------生產線程》資料交換完成!

thread-0------生產線程》的緩衝已空,開始放入!

thread-0------生產線程》的緩衝區已滿,等待交換資料!

thread-0------生產線程》資料交換完成!

thread-0------生產線程》的緩衝已空,開始放入!

thread-0------生產線程》的緩衝區已滿,等待交換資料!

thread-1------消費執行緒》資料交換完成!

thread-1------消費執行緒》的緩衝區已滿,開始消費!

thread-1------消費執行緒》的緩衝區已清空,等待互動資料!

thread-1------消費執行緒》資料交換完成!

thread-1------消費執行緒》的緩衝區已滿,開始消費!

thread-1------消費執行緒》的緩衝區已清空,等待互動資料!

029 執行緒輔助類 Exchanger

一 概述 該類描述的是乙個交換空間,我們可以理解為我們的生產者和消費者模型之中的緩衝區.二 類結構 構造方法 public exchanger 這個類的構造需要乙個泛型,表示需要交換的資料.exchange 交換資料.當傳入null的時候表示從緩衝區中獲取資料.三 例子 我們模擬乙個生產者和消費者的...

11 5 4執行緒 同步裝置之Exchanger

exchanger 讓兩個執行緒互換資訊 例項模擬服務生和顧客 服務生往空杯子中倒水 顧客從裝滿水的杯子中喝水 然後互換杯子 服務生接著倒水 顧客接著喝水.使用 exchanger 的關鍵技術點如下 1.初始化exchanger 物件時,可以通過泛型指定杯子能交換的資訊型別.如 new exchan...

十二 java多執行緒之Exchanger

github 今天我們講最後乙個同步工具類exchanger,這個比較簡單,就是讓兩個執行緒交換資料.exchanger只有兩個方法而已,而且兩個還是一樣的,只是引數不通而已 看過海賊王的人都知道山治和路飛,山治是乙個廚師,手藝那是槓槓的.路飛則是乙個大胃王,超能吃.現在編寫乙個程式,讓山治不斷給路...