Java併發之Exchanger類

應用場景

如果兩個線程在運行過程中需要交換彼此的信息,可以使用Exchanger這個類。
Exchanger爲線程交換信息提供了非常方便的途徑,它可以作爲兩個線程交換對象的同步點,只有當每個線程都在進入 exchange ()方法並給出對象時,才能接受其他線程返回時給出的對象。

使用方法

Exchanger的構造方法如下:

  • Exchanger(); //創建一個新的 Exchanger。

Exchanger用到的主要方法有:

  • exchange(V x); //等待另一個線程到達此交換點(除非它被中斷),然後將給定的對象傳送給該線程,並接收該線程的對象。

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

實例代碼

package Exchanger;

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

public class Exechanger {
    public static void main(String[] args) {
        ExecutorService exec=Executors.newCachedThreadPool();
        Exchanger<String> exchanger=new Exchanger<>();
        new Thread() {
            @Override
            public void run() {
                String data1="data1";
                try {
                    System.out.println(Thread.currentThread().getName()+"交換前的數據:"+data1);
                    String data2=exchanger.exchange(data1);
                    System.out.println(Thread.currentThread().getName()+"交換後的數據:"+data2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        new Thread() {
            @Override
            public void run() {
                String data2="data2";
                try {
                    System.out.println(Thread.currentThread().getName()+"交換前的數據:"+data2);
                    String data1=exchanger.exchange(data2);
                    System.out.println(Thread.currentThread().getName()+"交換後的數據:"+data1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章