文档章节

Java线程之Exchanger

ShortHand
 ShortHand
发布于 2016/08/29 13:51
字数 317
阅读 29
收藏 3

java.util.concurrent.Exchanger用于两个线程之间传递数据,并且只限于两个线程。该类通过exchange()方法进行线程之间的数据交换。线程A在调用exchange()方法之后会被阻塞,直到有线程B调用了exchange()方法。注意,这个的Exchanger对象为同一个。

1.exchange()方法的阻塞性:

public class ThreadA extends Thread {

	private Exchanger<String> exchanger;

	public ThreadA(Exchanger<String> exchanger) {
		super();
		this.exchanger = exchanger;
	}

	@Override
	public void run() {
		try {
			System.out.println("线程A中得到线程B的数据" + exchanger.exchange("ThreadA"));
			System.out.println("ThreadA end!");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

public class Run {
	public static void main(String[] args) {
		Exchanger<String> exchanger = new Exchanger<String>();
		ThreadA a = new ThreadA(exchanger);
		a.start();
		System.out.println("ThreadMain end!");
	}
}

运行Run,System.out.println("线程A中得到线程B的数据" + exchanger.exchange("ThreadA"));没有被输出,因为此时就一个线程调用了exchange()方法,线程被阻塞。运行结果如下:

输入图片说明

2.exchange()数据交换:

public class ThreadB extends Thread {

	private Exchanger<String> exchanger;

	public ThreadA(Exchanger<String> exchanger) {
		super();
		this.exchanger = exchanger;
	}

	@Override
	public void run() {
		try {
			System.out.println("线程B中得到线程A的数据" + exchanger.exchange("ThreadB"));
			System.out.println("ThreadA end!");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

public class Run {
	public static void main(String[] args) {
		Exchanger<String> exchanger = new Exchanger<String>();
		ThreadA a = new ThreadA(exchanger);
		ThreadB b = new ThreadB(exchanger);
		a.start();
		b.start();
	}
}

运行结果如下:

输入图片说明

根据上面的演示我们很容易用Exchanger实现生产者消费者的场景。

© 著作权归作者所有

ShortHand
粉丝 3
博文 78
码字总数 16508
作品 0
静安
高级程序员
私信 提问
【JDK源码分析】同步工具Exchanger,它内部实现原理你看懂了吗?

前言 Exchanger应该算并发包中工具使用相对少的,因为它主要用于线程之间交换数据,它的用法比较简单在不同线程之间使用exchange方法交换数据,但是内部实现比较巧妙,使用了unsafe的CAS原子...

编程SHA
2018/12/17
0
0
ThreadLocal 内存泄露相关注意事项

凡事有两面性,知道其优势和劣势才是我们选择使用与否的判断依据 1、优势 A:ThreadLocal 可以使得线程独有的局部变量,在整个线程存活期间内跨越类和实例的进行使用,等同于为线程内多个实例...

重城重楼
04/10
0
0
Java多线程11 同步工具类Exchanger

Java多线程目录 1 Exchanger 介绍 前面分别介绍了CyclicBarrier、CountDownLatch、Semaphore,现在介绍并发工具类中的最后一个Exchange。 Exchanger 是一个用于线程间协作的工具类,Exchang...

香沙小熊
2018/12/03
0
0
读书笔记之《Java并发编程的艺术》-并发编程容器和框架(重要)

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1
【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___
2018/05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

研究下这代码,用到了guava和线程池

import com.google.common.util.concurrent.FutureCallback;import com.google.common.util.concurrent.Futures;import com.google.common.util.concurrent.ListenableFuture;import c......

暗中观察
5分钟前
0
0
《css 揭秘》 之垂直居中的实现

最近看了 Lea Verou 的 《css揭秘》一书,让我对自己的 css学习产生了深深的怀疑。这本书真是太棒了,里面涉及到很多优雅又有趣的效果实现,真的是非常棒。如果你有时间,十分建议你去看看。...

IrisHuang
10分钟前
0
0
java 抽象类(2)

/*需求: 描述一个图形、圆形、 矩形三个类。不管哪种图形都会具备计算面积与周长的行为,但是每种图形计算的方式不一致而已。常量的命名规范:全部字母大写,单词与单词 之间 使用下...

hellation_
13分钟前
0
0
总结:堆和栈

堆 堆比较好理解,即存放对象的地方。这里的对象由GC管理 1、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命...

浮躁的码农
18分钟前
1
0
JavaScript 新语法详解:Class 的私有属性与私有方法

译者按: 为什么偏要用**#**符号? 原文:JavaScript's new #private class fields 译者:Fundebug 本文采用意译,版权归原作者所有 proposal-class-fields与proposal-private-methods定义了 ...

Fundebug
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部