Java多线程中的Exchanger应用简析

 更新时间:2023年12月01日 09:41:20   作者:securitit  
这篇文章主要介绍了Java多线程中的Exchanger应用简析,Exchanger提供了一个同步点exchange方法,两个线程调用exchange方法时,无论调用时间先后,两个线程会互相等到线程到达exchange方法调用点,此时两个线程可以交换数据,将本线程产出数据传递给对方,需要的朋友可以参考下

Exchanger简析

Exchanger用于线程间进行通信、数据交换。

Exchanger提供了一个同步点exchange方法,两个线程调用exchange方法时,无论调用时间先后,两个线程会互相等到线程到达exchange方法调用点,此时两个线程可以交换数据,将本线程产出数据传递给对方。

演示示例1

package com.securitit.serialize.juc;
import java.util.concurrent.Exchanger;
public class ExchangerTester {
	// Exchanger实例.
	private static final Exchanger<String> exchanger = new Exchanger<String>();
	public static void main(String[] args) {
		// 模拟阻塞线程.
		new Thread(() -> {
			try {
				String wares = "红烧肉";
				System.out.println(Thread.currentThread().getName() + "商品方正在等待金钱方,使用货物兑换为金钱.");
				Thread.sleep(2000);
				String money = exchanger.exchange(wares);
				System.out.println(Thread.currentThread().getName() + "商品方使用商品兑换了" + money);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}).start();
		// 模拟阻塞线程.
		new Thread(() -> {
			try {
				String money = "人民币";
				System.out.println(Thread.currentThread().getName() + "金钱方正在等待商品方,使用金钱购买食物.");
				Thread.sleep(4000);
				String wares = exchanger.exchange(money);
				System.out.println(Thread.currentThread().getName() + "金钱方使用金钱购买了" + wares);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}).start();
	}
}

输出结果:

Thread-0商品方正在等待金钱方,使用货物兑换为金钱.
Thread-1金钱方正在等待商品方,使用金钱购买食物.
Thread-0商品方使用商品兑换了人民币
Thread-1金钱方使用金钱购买了红烧肉

从结果可以看出,线程Thread-0首先调用了exchange方法,等待线程Thread-1到达exchange方法。

当线程Thread-0和Thread-1两者都到达exchange方法时,通过exchange进行了数据交换。从结果可以看出,两个都拿到了对方传递的数据。

演示示例2

接下来演示public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException;

package com.securitit.serialize.juc;
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;
public class ExchangerTimeTester {
	// Exchanger实例.
	private static final Exchanger<String> exchanger = new Exchanger<String>();
	public static void main(String[] args) {
		// 模拟阻塞线程.
		new Thread(() -> {
			try {
				String wares = "红烧肉";
				System.out.println(Thread.currentThread().getName() + "商品方正在等待金钱方,使用货物兑换为金钱.");
				Thread.sleep(2000);
				String money = exchanger.exchange(wares, 1000, TimeUnit.MILLISECONDS);
				System.out.println(Thread.currentThread().getName() + "商品方使用商品兑换了" + money);
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}).start();
		// 模拟阻塞线程.
		new Thread(() -> {
			try {
				String money = "人民币";
				System.out.println(Thread.currentThread().getName() + "金钱方正在等待商品方,使用金钱购买食物.");
				Thread.sleep(4000);
				String wares = exchanger.exchange(money);
				System.out.println(Thread.currentThread().getName() + "金钱方使用金钱购买了" + wares);
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}).start();
	}
}

输出结果:

Thread-0商品方正在等待金钱方,使用货物兑换为金钱.
Thread-1金钱方正在等待商品方,使用金钱购买食物.
java.util.concurrent.TimeoutException
    at java.util.concurrent.Exchanger.exchange(Exchanger.java:626)
    at com.securitit.serialize.juc.ExchangerTimeTester.lambda$0(ExchangerTimeTester.java:18)
    at java.lang.Thread.run(Thread.java:748)

public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException;

API中,若阻塞线程等待超过指定时间,则会抛出异常。

到此这篇关于Java多线程中的Exchanger应用简析的文章就介绍到这了,更多相关Exchanger简析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 实体类与String相互转换实现方式

    实体类与String相互转换实现方式

    文章记录了将实体类与String相互转换的方法,此方法适用于多种场景,如配置转换等,转换过程包括将实体类转为String保存至数据库,从数据库取出String再转为实体类,此经验仅供参考
    2026-04-04
  • springboot ElasticSearch如何配置自定义转换器ElasticsearchCustomConversions

    springboot ElasticSearch如何配置自定义转换器ElasticsearchCustomConver

    这篇文章主要介绍了springboot ElasticSearch如何配置自定义转换器ElasticsearchCustomConversions问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • spring batch 读取多个文件数据导入数据库示例

    spring batch 读取多个文件数据导入数据库示例

    本篇文章主要介绍了spring batch 读取多个文件数据导入数据库示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • java数组输出的实例代码

    java数组输出的实例代码

    这篇文章主要介绍了java数组输出的实例代码,有需要的朋友可以参考一下
    2013-12-12
  • 解决mybatis-generator生成器添加类注释方法无效的问题

    解决mybatis-generator生成器添加类注释方法无效的问题

    这篇文章主要介绍了解决mybatis-generator生成器添加类注释方法无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Nexus安装和启动的实现教程

    Nexus安装和启动的实现教程

    这篇文章主要介绍了Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Java9版本新特性同一个Jar支持多JDK版本运行

    Java9版本新特性同一个Jar支持多JDK版本运行

    这篇文章主要为大家介绍了Java9新版本的特性之同一个Jar支持多JDK版本运行的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Spring MVC @GetMapping和@PostMapping注解的使用方式

    Spring MVC @GetMapping和@PostMapping注解的使用方式

    这篇文章主要介绍了Spring MVC @GetMapping和@PostMapping注解的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java中@EnableAutoConfiguration注解使用

    java中@EnableAutoConfiguration注解使用

    在Spring Boot框架中,@EnableAutoConfiguration是一种非常重要的注解,本文就来介绍一下java中@EnableAutoConfiguration注解使用,感兴趣的可以了解一下
    2023-11-11
  • Java数据结构之链表的概念及结构

    Java数据结构之链表的概念及结构

    这篇文章主要介绍了数据链表的概念及结构,链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。想进一步了解的同学,可以参考阅读本文
    2023-04-04

最新评论