Java線程之Exchanger

java.util.concurrent.Exchanger用於兩個線程之間傳遞數據,而且只限於兩個線程。該類經過exchange()方法進行線程之間的數據交換。線程A在調用exchange()方法以後會被阻塞,直到有線程B調用了exchange()方法。注意,這個的Exchanger對象爲同一個。java

1.exchange()方法的阻塞性:

public class ThreadA extends Thread {

	private Exchanger<String> exchanger;

	public ThreadA(Exchanger<String> exchanger) {
		super();
		this.exchanger = exchanger;
	}

	@Override
	public void run() {
		try {
			System.out.println("線程A中獲得線程B的數據" + exchanger.exchange("ThreadA"));
			System.out.println("ThreadA end!");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
public class Run {
	public static void main(String[] args) {
		Exchanger<String> exchanger = new Exchanger<String>();
		ThreadA a = new ThreadA(exchanger);
		a.start();
		System.out.println("ThreadMain end!");
	}
}

運行Run,System.out.println("線程A中獲得線程B的數據" + exchanger.exchange("ThreadA"));沒有被輸出,由於此時就一個線程調用了exchange()方法,線程被阻塞。運行結果以下:ide

輸入圖片說明

2.exchange()數據交換:

public class ThreadB extends Thread {

	private Exchanger<String> exchanger;

	public ThreadA(Exchanger<String> exchanger) {
		super();
		this.exchanger = exchanger;
	}

	@Override
	public void run() {
		try {
			System.out.println("線程B中獲得線程A的數據" + exchanger.exchange("ThreadB"));
			System.out.println("ThreadA end!");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
public class Run {
	public static void main(String[] args) {
		Exchanger<String> exchanger = new Exchanger<String>();
		ThreadA a = new ThreadA(exchanger);
		ThreadB b = new ThreadB(exchanger);
		a.start();
		b.start();
	}
}

運行結果以下:this

輸入圖片說明

根據上面的演示咱們很容易用Exchanger實現生產者消費者的場景。線程

相關文章
相關標籤/搜索