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实现生产者消费者的场景。线程

相关文章
相关标签/搜索