当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2022-07-05
概念 Exchange主要是两个线程的数据交换,如果超过两个线程都不行 Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同

概念

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

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

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

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

案例

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]


上一篇:Java并发编程之CyclicBarrier的代码演示 *
下一篇:没有了
网友评论