java多线程-java Exchanger线程间交换数据

sancaiodm Java 2021-12-26 1023 0

     Exchanger是一个用于线程间协作的工具类。用于进行线程间的数据交换。它提供一个同步点,在这个同步点,两个线程(两个以上的线程不可以)可以彼此交换数据。

     这两个线程通过Exchanger的exchanger方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,只有当两个线程都到达同步点时,这两个线程才可以互换数据,将本线程生产出来的数据传递给对方。如下示例we的值123传递给they,they的456值传递给we.

public class ExchangerThreadMain {

	private static final Exchanger<Integer> exchanger = new Exchanger();
	private static ExecutorService threadPool =Executors.newFixedThreadPool(2);
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		threadPool.execute(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				int we = 123;
				try {
				  System.out.println(Thread.currentThread().getName());
				 //只有两个线程都到达同步点时才可以互相交换数据,如一个线程先到达,则在此等待另一个线程
				 int they =	exchanger.exchange(we);
				 System.out.println(Thread.currentThread().getName()+ " they ="+they);
				}catch(Exception e) {
					e.printStackTrace();
				}
			}
			
		});
		
		threadPool.execute(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				int they = 456;
				try {
				  System.out.println(Thread.currentThread().getName());
				  //只有两个线程都到达同步点时才可以互相交换数据,如一个线程先到达,则在此等待另一个线程
				  int we = exchanger.exchange(they);
				  System.out.println(Thread.currentThread().getName()+ " we ="+we);
				}catch(Exception e) {
					e.printStackTrace();
				}
			}
			
		});
	}
}

结果输出:

image.png

Exchanger工具类的关键是exchange方法,同步点,只有两个线程都到达此同步点才可以互换数据,我们可以把此同步点当成一个状态,也就是说只有两个线程同时运行至此状态处才可以继续往下执行。如此运用也可以实现两个线程之的CountDownLatch应用。

评论