首页 > 代码库 > Java多线程与并发库高级应用之线程数据交换Exchanger
Java多线程与并发库高级应用之线程数据交换Exchanger
JDK1.5提供了Exchanger用于两个线程的数据交换。两个线程先后到达交换点,先到达的线程会等待后到达的线程,然后两个线程互相交换数据,交换后双方持对方的数据。
Exchanger只提供了一个构造器:
Exchanger():创建一个新的Exchanger。
Exchanger中也只有两个方法:
V exchange(V x): 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
V exchange(V x, long timeout, TimeUnit unit): 等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。
见下面程序
[java] view plaincopy
- public class ExchangerDemo {
- public static void main(String[] args) {
- //线程池
- ExecutorService pool = Executors.newCachedThreadPool();
- //Exchanger
- final Exchanger<String> changer = new Exchanger<String>();
- //用于交互数据的线程1
- pool.execute(new Runnable() {
- @Override
- public void run() {
- try{
- String data1 = "苹果";
- System.out.println(Thread.currentThread().getName() +
- "-准备交换数据:" + data1);
- Thread.sleep((long)(Math.random()*10000));
- String data2 = (String)changer.exchange(data1);
- System.out.println(Thread.currentThread().getName() +
- "-已交换完数据,交换到的数据:" + data1);
- }catch(InterruptedException e){
- e.printStackTrace();
- }
- }
- });
- //用于交互数据的线程2
- pool.execute(new Runnable() {
- @Override
- public void run() {
- try{
- String data1 = "石榴";
- System.out.println(Thread.currentThread().getName() +
- "-准备交换数据:" + data1);
- Thread.sleep((long)(Math.random()*10000));
- String data2 = (String)changer.exchange(data1);
- System.out.println(Thread.currentThread().getName() +
- "-已交换完数据,交换到的数据:" + data1);
- }catch(InterruptedException e){
- e.printStackTrace();
- }
- }
- });
- pool.shutdown();
- }
- }
运行程序
看到两个线程将数据彼此交换。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。