Java多线程与并发库高级应用之线程数据交换Exchanger

JDK1.5提供了Exchanger用于两个线程的数据交换。两个线程先后到达交换点,先到达的线程会等待后到达的线程,然后两个线程互相交换数据,交换后双方持对方的数据。

Exchanger只提供了一个构造器:

Exchanger():创建一个新的Exchanger。

Exchanger中也只有两个方法:

V exchange(V
x): 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。

V
exchange(V x, long timeout, TimeUnit unit): 等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。

见下面程序

[java] view plaincopy

  1. public class ExchangerDemo {
  2. public static void main(String[] args) {
  3. //线程池

  4. ExecutorService pool = Executors.newCachedThreadPool();

  5. //Exchanger

  6. final Exchanger<String> changer = new Exchanger<String>();
  7. //用于交互数据的线程1

  8. pool.execute(new Runnable() {
  9. @Override

  10. public void run() {

  11. try{

  12. String data1 = "苹果";

  13. System.out.println(Thread.currentThread().getName() +

  14. "-准备交换数据:" + data1);

  15. Thread.sleep((long)(Math.random()*10000));

  16. String data2 = (String)changer.exchange(data1);

  17. System.out.println(Thread.currentThread().getName() +

  18. "-已交换完数据,交换到的数据:" + data1);

  19. }catch(InterruptedException e){

  20. e.printStackTrace();

  21. }

  22. }

  23. });
  24. //用于交互数据的线程2

  25. pool.execute(new Runnable() {
  26. @Override

  27. public void run() {

  28. try{

  29. String data1 = "石榴";

  30. System.out.println(Thread.currentThread().getName() +

  31. "-准备交换数据:" + data1);

  32. Thread.sleep((long)(Math.random()*10000));

  33. String data2 = (String)changer.exchange(data1);

  34. System.out.println(Thread.currentThread().getName() +

  35. "-已交换完数据,交换到的数据:" + data1);

  36. }catch(InterruptedException e){

  37. e.printStackTrace();

  38. }

  39. }

  40. });
  41. pool.shutdown();

  42. }

  43. }


运行程序

看到两个线程将数据彼此交换。

Java多线程与并发库高级应用之线程数据交换Exchanger,码迷,mamicode.com

时间: 2024-08-02 07:00:19

Java多线程与并发库高级应用之线程数据交换Exchanger的相关文章

Java多线程与并发库高级应用-java5线程并发库

java5 中的线程并发库 主要在java.util.concurrent包中 还有 java.util.concurrent.atomic子包和java.util.concurrent.lock子包

Java多线程与并发库高级应用-传统线程同步通信技术

面试题: 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着又 主线程循环100次,如此循环50次,请写出程序 /** * 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着又 主线程循环100次,如此循环50次,请写出程序 * * @author Administrator * */ public class TraditionalThreadCommunication { public static void main(String[] arg

Java多线程与并发库高级应用-传统线程互斥技术

  /** * 启动两个线程分别打印两个名字,名字按照字符一个一个打印 * * @author Administrator * */ public class TraditionalThreadSynchronized { public static void main(String[] args) { new TraditionalThreadSynchronized().init(); } public void init() { final Outputer outputer = new

Java多线程与并发库高级应用之公共屏障点CyclicBarrier

一个小队去登山,每位队员登山的速度不同.山上有几个集合点,在每一集合点处,先到达的队员只有等后面的队员全部到达集合点后才能继续向下一个集合点出发. JDK1.5提供的CyclicBarrier模拟了这种情况.每一个线程相当于一个登山队员,CyclicBarrier相当于山上的集合点.只有等所有线程都执行到了CyclicBarrier后才可以继续向下执行. CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程

Java多线程与并发库高级应用之信号量Semaphore

JDK1.5提供了一个计数信号量Semaphore类.Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,并提供了同步机制. Semaphore提供了两个构造器来创建对象: 1)Semaphore(int permits):创建具有给定的许可数和非公平的公平设置的Semaphore. 2)Semaphore(int permits, boolean fair):创建具有给定的许可数和给定的公平设置的Semaphore.如果此信号量保证在争用时按先进先出的顺序授予许可,则为

Java多线程与并发库高级应用之阻塞队列BlockingQueue

JDK1.5提供了阻塞队列接口BlockingQueue,它是一个有界阻塞队列.BlockingQueue实现是线程安全的,可以安全地与多个生产者和多个使用者一起使用. 使用时用其实现类 ArrayBlockingQueue,它一个由数组支持的有界阻塞队列.此队列按 FIFO(先进先出)原则对元素进行排序.队列的头部 是在队列中存在时间最长的元素.队列的尾部是在队列中存在时间最短的元素.新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素. 这是一个典型的"有界缓存区",固定

Java多线程与并发库高级应用之倒计时计数器

CountDownLatch 类是一个倒计时计数器,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数初始化 CountDownLatch.由于调用了countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞.之后,会释放所有等待的线程,await 的所有后续调用都将立即返回. CountDownLatch 是一个通用同步工具,它有很多用途.将计数1初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:在通过调用 c

Java多线程与并发库高级应用 学习笔记 10-16课

Callable与Future的介绍 package Thread; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorCompletionService; im

Java多线程与并发库高级应用 学习笔记 1-9课

来源XXX,免得打广告嫌疑. http://www.cnblogs.com/whgw/archive/2011/10/03/2198506.html 今天看了文章才发现创建线程最佳方式为实现Runnable接口,之前的习惯要改鲁. http://blog.csdn.net/imzoer/article/details/8500670 Java中Timer的用法 package timer; import java.util.Calendar; import java.util.Timer; im