Exchanger的使用

简介:

  两个线程可以交换对象的同步点。每个线程都在进入 exchange方法时给出某个对象,并接受其他线程返回时给出的对象。

  用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据。












构造方法摘要
**[Exchanger](http://www.cnblogs.com/java/util/concurrent/Exchanger.html#Exchanger())**()
          创建一个新的 Exchanger。


 


















方法摘要
[V](http://www.cnblogs.com/java/util/concurrent/Exchanger.html "Exchanger 中的类型参数") **[exchange](http://www.cnblogs.com/java/util/concurrent/Exchanger.html#exchange(V))**([V](http://www.cnblogs.com/java/util/concurrent/Exchanger.html "Exchanger 中的类型参数") x)
          等待另一个线程到达此交换点(除非它被中断)),然后将给定的对象传送给该线程,并接收该线程的对象。
[V](http://www.cnblogs.com/java/util/concurrent/Exchanger.html "Exchanger 中的类型参数") **[exchange](http://www.cnblogs.com/java/util/concurrent/Exchanger.html#exchange(V, long, java.util.concurrent.TimeUnit))**([V](http://www.cnblogs.com/java/util/concurrent/Exchanger.html "Exchanger 中的类型参数") x, long timeout, [TimeUnit](http://www.cnblogs.com/java/util/concurrent/TimeUnit.html "java.util.concurrent 中的枚举") unit)
          等待另一个线程到达此交换点(除非它被中断),或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。


 


 1 package com.thread;
 2 import java.util.concurrent.Exchanger;
 3 import java.util.concurrent.ExecutorService;
 4 import java.util.concurrent.Executors;
 5
 6 public class ExchangerTest {
 7
 8     public static void main(String[] args) {
 9         ExecutorService service = Executors.newCachedThreadPool();
10         final Exchanger exchanger = new Exchanger();
11         service.execute(new Runnable(){
12             public void run() {
13                 try {
14                     Thread.sleep((long)(Math.random()10000));
15                     String data1 = “zxx”;
16                     System.out.println(“线程” + Thread.currentThread().getName() +
17                     “正在把数据” + data1 +”换出去”);
18                     String data2 = (String)exchanger.exchange(data1);
19                     System.out.println(“线程” + Thread.currentThread().getName() +
20                     “换回的数据为” + data2);
21                 }catch(Exception e){
22
23                 }
24             }
25         });
26         service.execute(new Runnable(){
27             public void run() {
28                 try {
29                     Thread.sleep((long)(Math.random()10000));
30                     String data1 = “lhm”;
31                     System.out.println(“线程” + Thread.currentThread().getName() +
32                     “正在把数据” + data1 +”换出去”);
33                     String data2 = (String)exchanger.exchange(data1);
34                     System.out.println(“线程” + Thread.currentThread().getName() +
35                     “换回的数据为” + data2);
36                 }catch(Exception e){
37
38                 }
39             }
40         });
41     }
42 }

运行结果如下:

线程pool-1-thread-1正在把数据zxx换出去
线程pool-1-thread-2正在把数据lhm换出去
线程pool-1-thread-1换回的数据为lhm
线程pool-1-thread-2换回的数据为zxx

相关文章
|
2月前
|
安全 Java API
Java并发基础:Exchanger全面解析!
Exchanger类的优点在于能够简洁高效地实现两个线程间的数据交换,通过Exchanger,开发者可以避免复杂的锁和同步机制,降低并发编程的难度,同时,它还提供了线程安全的数据交换保障,使得多线程协作更为可靠、易用性和高效性。
Java并发基础:Exchanger全面解析!
|
6月前
|
存储 安全 Java
ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
|
8月前
|
资源调度
JUC并发编程之同步器(Semaphore、CountDownLatch、CyclicBarrier、Exchanger、CompletableFuture)附带相关面试题
1.Semaphore(资源调度) 2.CountDownLatch(子线程优先) 3.CyclicBarrier(栅栏) 4.Exchanger(公共交换区) 5.CompletableFuture(异步编程)
100 0
|
1月前
|
存储 Java 数据库连接
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
34 0
|
3月前
|
Java
JUC 常用 4 大并发工具类 CountDownLatch、CyclicBarrier、Semaphore、ExChanger
JUC 常用 4 大并发工具类 CountDownLatch、CyclicBarrier、Semaphore、ExChanger
|
4月前
学习多线程之Exchanger使用
学习多线程之Exchanger使用
16 0
|
6月前
|
缓存 安全 Java
JUC第三十讲:JUC工具类:Exchanger详解
JUC第三十讲:JUC工具类:Exchanger详解
|
9月前
|
Java 双11
Semaphore和Exchanger
Semaphore和Exchanger
|
算法 Java API
【JUC】交换器Exchanger详解
【JUC】交换器Exchanger详解
89 0
【JUC】交换器Exchanger详解
|
算法
BlockingQueue二
接着上篇BlockingQueue没讲完的 LinkedTransferQueue LinkedTransferQueue是一个由链表结构组成的无界阻塞队列,相对于其它阻塞队列,LinkedBlockingQueue可以算是LinkedBlockingQueue与SynhronoousQueue结合,LinkedtransferQueue是一种无界阻塞队列,底层基于单链表实现,其内部结构分为数据节点、请求节点,基于CAS无锁算法实现
95 0
BlockingQueue二