`

jdk1.5——Exchanger 交换

 
阅读更多

 

 

 

案例1:  买卖包子,  只能用于两个线程之间,当两个线程之间同时到达时Exchanger(可以类比于包子铺)

发生数据交换,否则等待:

package thread;

import java.util.Random;
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;

public class ExchangerDemo {

	/**
	 * Thread-0: 卖包子。。。
Thread-1: 买包子。。。
Thread-0 : 拿到了100元钱
Thread-1 : 拿到了100个包子
	 */
	public static void main(String[] args) {

		final Exchanger<String> exchanger = new Exchanger<String>();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(Thread.currentThread().getName()
						+ ": 卖包子。。。");
				try {
					TimeUnit.SECONDS.sleep(new Random().nextInt(5));
					String data1 = "100个包子";
					String result = exchanger.exchange(data1);
					System.out.println(Thread.currentThread().getName()+ " : 拿到了" + result);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}
			
		}).start();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(Thread.currentThread().getName()
						+ ": 买包子。。。");
				try {
					TimeUnit.SECONDS.sleep(new Random().nextInt(5));
					String data1 = "100元钱";
					String result = exchanger.exchange(data1);
					System.out.println(Thread.currentThread().getName()+ " : 拿到了" + result);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}
			
		}).start();
	}
	
	

}

 

 

 

 

package cn.itcast.heima2;
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
线程pool-1-thread-1正在把数据hello换出去
线程pool-1-thread-2正在把数据future换出去
线程pool-1-thread-1换回的数据为future
线程pool-1-thread-2换回的数据为hello


第一个拿出数据的人将一直等到第二个人拿到数据到来时,才彼此交换数据。

 * @author zm
 *
 */
public class ExchangerTest {

	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		final Exchanger exchanger = new Exchanger();
		service.execute(new Runnable(){
			public void run() {
				try {				

					String data1 = "hello";
					System.out.println("线程" + Thread.currentThread().getName() + 
					"正在把数据" + data1 +"换出去");
					Thread.sleep((long)(Math.random()*10000));// 真实中需要替换成业务, 业务有耗时操作  这里使用沉睡来模拟
					String data2 = (String)exchanger.exchange(data1);// 操作完上一行业务后, 甲将自己数据hello 和 乙做交换
					System.out.println("线程" + Thread.currentThread().getName() + 
					"换回的数据为" + data2);
				}catch(Exception e){
					
				}
			}	
		});
		service.execute(new Runnable(){
			public void run() {
				try {				

					String data1 = "future";
					System.out.println("线程" + Thread.currentThread().getName() + 
					"正在把数据" + data1 +"换出去");
					Thread.sleep((long)(Math.random()*10000));					
					String data2 = (String)exchanger.exchange(data1);// 操作完上一行业务后,  乙将自己数据future 和 甲做交换, 当最终那个最慢的人也将数据拿出来后,交换完毕,双方分到需要的数据
					System.out.println("线程" + Thread.currentThread().getName() + 
					"换回的数据为" + data2);
				}catch(Exception e){
					
				}				
			}	
		});		
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics