java并发Exchanger的使用
2023-09-11 14:19:26 时间
简介
Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法。
两个线程都调用exchange方法之后,传入的参数就会交换。
类定义
public class Exchanger<V>
其中V表示需要交换的对象类型。
类继承
java.lang.Object
↳ java.util.concurrent.Exchanger<V>
Exchanger直接继承自Object。
构造函数
Exchanger()
Exchanger提供一个无参构造函数。
两个主要方法
- public V exchange(V x) throws InterruptedException
当这个方法被调用的时候,当前线程将会等待直到其他的线程调用同样的方法。当其他的线程调用exchange之后,当前线程将会继续执行。
在等待过程中,如果有其他的线程interrupt当前线程,则会抛出InterruptedException。
- public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
和第一个方法类似,区别是多了一个timeout时间。如果在timeout时间之内没有其他线程调用exchange方法,则会抛出TimeoutException。
具体的例子
我们先定义一个带交换的类:
@Data
public class CustBook {
private String name;
}
然后定义两个Runnable,在run方法中调用exchange方法:
@Slf4j
public class ExchangerOne implements Runnable{
Exchanger<CustBook> ex;
ExchangerOne(Exchanger<CustBook> ex){
this.ex=ex;
}
@Override
public void run() {
CustBook custBook= new CustBook();
custBook.setName("book one");
try {
CustBook exhangeCustBook=ex.exchange(custBook);
log.info(exhangeCustBook.getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Slf4j
public class ExchangerTwo implements Runnable{
Exchanger<CustBook> ex;
ExchangerTwo(Exchanger<CustBook> ex){
this.ex=ex;
}
@Override
public void run() {
CustBook custBook= new CustBook();
custBook.setName("book two");
try {
CustBook exhangeCustBook=ex.exchange(custBook);
log.info(exhangeCustBook.getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
最后在主方法中调用:
public class ExchangerUsage {
public static void main(String[] args) {
Exchanger<CustBook> exchanger = new Exchanger<>();
// Starting two threads
new Thread(new ExchangerOne(exchanger)).start();
new Thread(new ExchangerTwo(exchanger)).start();
}
}
我们看下结果:
22:14:09.069 [Thread-1] INFO com.flydean.ExchangerTwo - book one
22:14:09.073 [Thread-0] INFO com.flydean.ExchangerOne - book two
可以看到对象已经被交换了。
结语
Exchanger在两个线程需要交换对象的时候非常好用。大家可以在实际工作生活中使用。
本文的例子https://github.com/ddean2009/learn-java-concurrency/tree/master/Exchanger
欢迎关注我的公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com
相关文章
- 深入java面向对象四:Java 内部类种类及使用解析(转)
- Java实现 LeetCode 436 寻找右区间
- Java实现 蓝桥杯 算法提高 计算行列式
- Java实现 蓝桥杯VIP 算法提高 交换Easy
- Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
- 【JAVA】 02-Java对象细节
- [Kotlin] Using Java from Kotlin
- 【JAVA】基于MVC架构Java技术荟萃案例演练
- [Linux] Install java and add JAVA_HOME, PATH
- Java并发编程:Thread类的使用
- 【Java】java使用反射访问对象方法和成员变量
- Atitit.http代理的实现 代码java php c# python
- 【项目实战】并发编程之ScheduledExecutorService(Java提供的一个定时任务框架)入门介绍
- Java并发图文详解
- java并发编程实战读书笔记3
- Java并发编程实践笔记(一)
- 【Java 并发编程】Java 创建线程池的正确姿势: Executors 和 ThreadPoolExecutor 详解...
- 解决idea出现的java.lang.OutOfMemoryError: Java heap space的问题
- Java并发编程:Thread类的使用
- Java并发编程:Callable、Future和FutureTask
- 【JAVA】【NIO】5、Java NIO Scatter / Gather
- 使用Java操作Elasticsearch(Elasticsearch的java api使用)
- Java并发编程:深入剖析ThreadLocal
- 谈论高并发(十二)分析java.util.concurrent.atomic.AtomicStampedReference看看如何解决源代码CAS的ABA问题
- Java开发之高并发必备篇(六)——Lock和ReentrantLock(3)
- java多线程与并发笔记
- Java Servlet Filter(过滤器)是什么?它的方法有哪些?
- 【java基础】输入/输出流基本介绍