Java并发工具类(三)Exchanger

Java并发工具类(三)Exchanger

在J.U.C并发包中提供了一些工具类,可以供我们在日常的开发中,根据不同的情况去进行一些相关的并发控制,具体的类有:

CountDownLatch
Semaphore
Exchanger
CyclicBarrier

Exchanger

概念

Exchanger是线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程通过exchange方法交换(共享)彼此的数据。

实现

public static void main(String[] args) {  
	        Exchanger<Integer> exchanger = new Exchanger<>();
	        new Boss(exchanger).start();  
	        new Employee(exchanger).start();  
	    }  
class Bossextends Thread {  
    Exchanger<Integer> exchanger = null;  
    public Boss(Exchanger<Integer> exchanger) {  
        super();  
        this.exchanger = exchanger;  
    }  
    @Override  
    public void run() {  
        int money = 0;
        for(int i=0;i<4;i++){
        	money+=100000;
        	try {
				exchanger.exchange(money);
			} catch (Exception e) {
				e.printStackTrace();
			}
        }
    }  
}
class Employeeextends Thread {  
    Exchanger<Integer> exchanger = null;  
    int money = 0;
    public Employee(Exchanger<Integer> exchanger) {  
        super();  
        this.exchanger = exchanger;  
    }  
    @Override  
    public void run() {  
    	for(int i=0;i<4;i++){
    		try {
				money = exchanger.exchange(money,2,TimeUnit.SECONDS) ;
				System.out.println(money>300000?"您好,鉴于您为公司创收较多,将被评为优秀员工":money+"您好,鉴于您为公司创收较少,年终奖没有了");
			} catch (Exception e) {
				e.printStackTrace();
			}
    	}
    }  
}

执行结果

您好,鉴于您为公司创收较多,将被评为优秀员工

Exchanger特性

Exchanger主要用于二个线程之间交换数据,如果有一个线程没执行exchange()方法,则会一直等待,线程会一直阻塞;避免的方法,可以设置等待时间:exchange(V x, long timeout, TimeUnit unit) 

完整代码和相关依赖请见GitHub

https://github.com/dwyanewede/project-learn/tree/master/src/main/java/com/learn/demo/concurrent

相关文章推荐

Java并发工具类(一)CountDownLatch https://blog.csdn.net/shang_xs/article/details/87075550
Java并发工具类(二)CyclicBarrier https://blog.csdn.net/shang_xs/article/details/87077098
Java并发工具类(四)Semaphore https://blog.csdn.net/shang_xs/article/details/87090443

猜你喜欢

转载自blog.csdn.net/shang_xs/article/details/87078321