Exchanger
2015-08-16 23:48
381 查看
Exchanger可以在两个线程之间交换数据,只能是2个线程,不支持更多的线程之间互换数据。
当线程A调用Exchange对象的exchange()方法后,他会进入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行。
Exchanger很适合于一个生产者和一个消费者的生产者消费者模式。
当线程A调用Exchange对象的exchange()方法后,他会进入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行。
Exchanger很适合于一个生产者和一个消费者的生产者消费者模式。
public class ThreadLocalTest { public static void main(String[] args) { Exchanger<List<Integer>> exchanger = new Exchanger<>(); new Consumer(exchanger).start(); new Producer(exchanger).start(); } } class Producer extends Thread { List<Integer> list = new ArrayList<>(); Exchanger<List<Integer>> exchanger = null; public Producer(Exchanger<List<Integer>> exchanger) { super(); this.exchanger = exchanger; } @Override public void run() { Random rand = new Random(); for(int i=0; i<10; i++) { list.clear(); list.add(rand.nextInt(10000)); list.add(rand.nextInt(10000)); list.add(rand.nextInt(10000)); list.add(rand.nextInt(10000)); list.add(rand.nextInt(10000)); try { list = exchanger.exchange(list); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Consumer extends Thread { List<Integer> list = new ArrayList<>(); Exchanger<List<Integer>> exchanger = null; public Consumer(Exchanger<List<Integer>> exchanger) { super(); this.exchanger = exchanger; } @Override public void run() { for(int i=0; i<10; i++) { try { list = exchanger.exchange(list); } catch (InterruptedException e) { e.printStackTrace(); } System.out.print(list.get(0)+", "); System.out.print(list.get(1)+", "); System.out.print(list.get(2)+", "); System.out.print(list.get(3)+", "); System.out.println(list.get(4)+", "); } } }
相关文章推荐
- HDU 1045 Fire Net 状压暴力
- 【2】Hello World示例
- “==”和equals方法区别
- Python入门(十二) Json模块的使用
- String比较中==和equal()的区别
- 一步一步教你MVVM同时玩转INotifyPropertyChanged和ObservableCollection(转)
- 写给刚毕业的程序猿同学们,和心浮气躁的现在的我------摘自:编程狂人
- 《疯狂Android讲义》目录
- JStorm/Strom配置executors和tasks(线程和实例)
- 用create table 命令建立表
- Leetcode201(Bitwise AND of Numbers Range)
- 开源QT项目
- leetcode - Longest Palindromic Substring
- 如何在 Mac 上完美安装 MIT Scheme
- 杨明昭
- 数据结构 堆排序的实现
- Mac下配置Tomcat
- python科学计算_numpy_广播与下标
- uva uva 1612 - Guess
- PKCS1签名&PKCS7签名&PKCS7信封格式