Java线程之Exchanger

来源:互联网 发布:java 泛型 getclass 编辑:程序博客网 时间:2024/05/17 21:54

Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。

当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行

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;}@Overridepublic 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) {// TODO Auto-generated catch blocke.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;}@Overridepublic void run() {for(int i=0; i<10; i++) {try {list = exchanger.exchange(list);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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)+", ");}}}