Java并发编程之Exchange概念和Demo *

it2024-06-30  42

概念

Exchange主要是两个线程的数据交换,如果超过两个线程都不行

Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。

数据交换的过程中是线程安全的.

案例

import java.util.HashSet; import java.util.Set; import java.util.concurrent.Exchanger; /** * 类说明:演示Exchange用法 * 案例:ZJJ_JavaBasic_2020/10/21_19:48:28_8rzlp * A线程添加值,B线程添加B值 * 然后两者交换 , */ public class Demo01 { private static final Exchanger<Set<String>> exchange = new Exchanger<Set<String>>(); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { Set<String> setA = new HashSet<String>();//存放数据的容器 try { for (int i = 0; i < 5; i++) { setA.add("A线程添加的" + i); } /*添加数据 */ System.out.println("A线程的交换之前SetA里面的值 = " + setA); setA = exchange.exchange(setA);//交换set /*处理交换后的数据*/ System.out.println("A线程的交换之后SetA里面的值 = " + setA); } catch (InterruptedException e) { } } }).start(); new Thread(new Runnable() { @Override public void run() { Set<String> setB = new HashSet<String>();//存放数据的容器 try { /*添加数据 * */ for (int i = 0; i < 5; i++) { setB.add("B线程添加的" + i); } System.out.println("B线程的交换之前SetB里面的值 = " + setB); setB = exchange.exchange(setB);//交换set /*处理交换后的数据*/ System.out.println("B线程的交换之后SetB里面的值 = " + setB); } catch (InterruptedException e) { } } }).start(); } }

仔细看控制台打印的结果A线程添加的值和B线程添加的值对换了 控制台打印的结果

A线程的交换之前SetA里面的值 = [A线程添加的4, A线程添加的2, A线程添加的3, A线程添加的0, A线程添加的1] B线程的交换之前SetB里面的值 = [B线程添加的0, B线程添加的1, B线程添加的2, B线程添加的3, B线程添加的4] B线程的交换之后SetB里面的值 = [A线程添加的4, A线程添加的2, A线程添加的3, A线程添加的0, A线程添加的1] A线程的交换之后SetA里面的值 = [B线程添加的0, B线程添加的1, B线程添加的2, B线程添加的3, B线程添加的4]
最新回复(0)