Java并发——交换器

1. 交换器

交换器提供了一个线程彼此之间能够交换对象的同步点。

泛型类java.util.concurrent.Exchanger<V>实现了交换器。

Exchanger<V>类中的主要方法就是:exchange(V x)方法,成对的两个线程之间,都调用了该方法,就能在两个线程彼此都准备好数据后,成功的交换数据给对方,然后各自返回。如果想支持成对的两个线程之间,一个没耐性,等的时间过长,或者被打断了就不交换数据了,可以使用exchange(V x, long timeout, TimeUnit unit)方法。

2.常用方法

(1)Exchanger()构造函数

初始化一个交换器

(2)V exchange(V x)

在这个交互点上等待其他线程到达(除非调用线程被中断了),之后将所给对象传入其中,接收其他线程的对象作为返回。

(3)V exchange(V x, long timeout, TimeUnit unit)

指定调用线程愿意等待的时长,剩下的和上一个方法相同。

扫描二维码关注公众号,回复: 4616712 查看本文章

3. 示例

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

public class ExchangeTest {

	public static void main(String[] args)
	{
		final Exchanger<String> exchanger = new Exchanger<String>();
		Runnable rcat = new Runnable() {
			@Override
			public void run()
			{
				try {
					String data1 = "小鱼干";
					String name = Thread.currentThread().getName();
					System.out.println(name + "正在把食物" + data1 + "交换出去。" );
					Thread.sleep((long)(Math.random()*1000));
					String data2 = (String)exchanger.exchange(data1);
					System.out.println(name + "交换回来的食物为:" + data2);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		};
		
		Runnable rdog = new Runnable() {
			@Override
			public void run()
			{
				try {
					String data1 = "小骨头";
					String name = Thread.currentThread().getName();
					System.out.println(name + "正在把食物" + data1 + "交换出去。" );
					Thread.sleep((long)(Math.random()*1000));
					String data2 = (String)exchanger.exchange(data1);
					System.out.println(name + "交换回来的食物为:" + data2);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		};
		
	    ExecutorService executorService = Executors.newCachedThreadPool();
	    executorService.submit(rcat);
	    executorService.submit(rdog);
	    try {
			Thread.sleep(2000);                   //模拟交换的过程
			System.out.println("交换完成!");
			executorService.shutdown();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 运行结果:

pool-1-thread-1正在把食物小鱼干交换出去。
pool-1-thread-2正在把食物小骨头交换出去。
pool-1-thread-2交换回来的食物为:小鱼干
pool-1-thread-1交换回来的食物为:小骨头
交换完成!

猜你喜欢

转载自blog.csdn.net/zhm1563550235/article/details/84449725