17_張孝祥_多線程_同步工具Exchanger

可以在對中對元素進行配對和交換的線程的同步點。每個線程將條目上的某個方法呈現給 exchange 方法,與夥伴線程進行匹配,並且在返回時接收其夥伴的對象。Exchanger 可能被視爲 SynchronousQueue 的雙向形式。Exchanger 可能在應用程序(比如遺傳算法和管道設計)中很有用。

構造方法摘要
Exchanger() 創建一個新的 Exchanger。

方法摘要

CountDownLatch CyclicBarrier
V exchange(V x) 等待另一個線程到達此交換點(除非當前線程被中斷),然後將給定的對象傳送給該線程,並接收該線程的對象。
V exchange(V x, long timeout, TimeUnit unit) 等待另一個線程到達此交換點(除非當前線程被中斷,或者超出了指定的等待時間),然後將給定的對象傳送給該線程,同時接收該線程的對象。

代碼示例
交換操作必須是成雙成對的,如果線程是奇數操作,那麼兩個會交換成功,另一個會一直等待交換。

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExchangerTest {

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        final Exchanger<String> exchanger = new Exchanger<String>();
        service.execute(new Runnable() {

            public void run() {
                try {
                    String data1 = "zxx";
                    System.out.println("線程" + Thread.currentThread().getName()
                            + "正在把數據" + data1 + "換出去");
                    Thread.sleep((long) Math.random() * 10000);

                    String data2=(String) exchanger.exchange(data1);
                    System.out.println("線程" + Thread.currentThread().getName()
                            + "換回的數據爲" + data2);
                } catch (Exception e) {

                    e.printStackTrace();
                }
            }
        });

        service.execute(new Runnable() {

            public void run() {
                try {
                    String data1 = "lhm";
                    System.out.println("線程" + Thread.currentThread().getName()
                            + "正在把數據" + data1 + "換出去");
                    Thread.sleep((long) Math.random() * 10000);

                    String data2=(String) exchanger.exchange(data1);
                    System.out.println("線程" + Thread.currentThread().getName()
                            + "換回的數據爲" + data2);
                } catch (Exception e) {

                    e.printStackTrace();
                }
            }
        });
        service.shutdown();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章