Exchanger与CyclicBarrier区别是,前者可以用于2个线程交换数据。
Exchanger一般用于2个线程,在到达栅栏位置调用exchange(Object o)方法,如果全部线程没有到达栅栏位置,此时先到的线程会阻塞,只到全部线程到达栅栏位置。exchange方法会提交本线程的数据(参数),获取另外一个线程提交的数据(响应)。
package cn.concurrent.t10;
import java.util.concurrent.Exchanger;
public class EC {
public static void main(String[] args) {
final Exchanger<String> e=new Exchanger<String>();
final Exchanger<String> e1=new Exchanger<String>();
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+">>>>>>>>:到达位置,提交one");
Object exchange = e.exchange("one");
System.out.println(Thread.currentThread().getName()+">>>>>>>>:调用exchange后返回:"+exchange);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+">>>>>>>>:到达位置,提交two");
Object exchange = e.exchange("two");
System.out.println(Thread.currentThread().getName()+">>>>>>>>:调用exchange后返回:"+exchange);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+">>>>>>>>:到达位置,提交three");
Object exchange = e1.exchange("three");
System.out.println(Thread.currentThread().getName()+">>>>>>>>:调用exchange后返回:"+exchange);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+">>>>>>>>:到达位置,提交four");
Object exchange = e1.exchange("four");
System.out.println(Thread.currentThread().getName()+">>>>>>>>:调用exchange后返回:"+exchange);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}