也就是说 exchange 方法就是一个交换点,线程会等待在此交换点,直到有另一个线程也调用了 exchange 方法(相当于进入到了此交换点),这时他们会互换数据,然后执行后续的代码。
Exchange 的基础使用如下,我们创建两个线程来模拟“一手交钱、一手交货”的场景,线程 1 先准备好钱进入交换点,然后等待线程 2 在 2s 之后准备好货(物),之后再彼此交互数据,执行后续的流程,具体实现代码如下:
import java.time.LocalDateTime;
import java.util.concurrent.Exchanger;
public class ExchangeExample {
// 创建一个交互器
private final static Exchangerexchange = new Exchanger<>();
public static void main(String[] args) {
// 线程 1【准备钱】
new Thread(() -> {
System.out.println("线程1:准备筹钱中...| Time:" + LocalDateTime.now());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String moeny = "1000 万";
System.out.println("线程1:钱准备好了【1000 万】。| Time:" +
LocalDateTime.now());
try {
// 执行数据交换【交易】
String result = exchange.exchange(moeny);
System.out.println("线程1:交易完成,得到【" + result +
"】 | Time:" + LocalDateTime.now());
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
// 线程 2【准备货】
new Thread(() -> {
System.out.println("线程2:准备物品中【西伯利亚新鲜空气】...| Time:" +
LocalDateTime.now());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String goods = "西伯利亚新鲜空气";
System.out.println("线程2:物品准备好了【西伯利亚新鲜空气】。| Time:" +
LocalDateTime.now());
try {
// 执行数据交换【交易】
String result = exchange.exchange(goods);
System.out.println("线程2:交易完成,得到【" + result +
"】 | Time:" + LocalDateTime.now());
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
以上程序的执行结果如下:
Exchange 交换器是用来实现两个线程间的数据交换的,Exchanger 可以交互任意数据类型的数据,只要在创建的时候定义泛型类型即可。它的核心方法为 exchange,当线程执行到此方法之后,会休眠等待另一个线程也进入交换点,如果另一个线程也进入了交换点(也执行到了 exchange 方法),此时二者会交换数据,并执行后续的流程。
分享题目:面试突击:说一下 JUC 中的 Exchange 交换器?
网址分享:http://www.shufengxianlan.com/qtweb/news16/468016.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联