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 Boss extends 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 Employee extends 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