线程的并发工具类(5)---Exchanger
Exchanger的使用
- Exchanger介绍
- 1.1 用法场景
- 1.2 原理
- Exchanger使用
1. Exchanger介绍
Exchanger使用的比较少,这里只做了解。
Exchanger:两个线程之间的数据交换。
1.1 用法场景
两个线程之间的数据交换。
1.2 原理
初始化Exchanger实例,在两个线程ThreadOne()和ThreadTwo()中分别调用exchange()方法,当两个线程都运行到exchange()的时候数据会进行交换,改变初始化的数据。只涉及到两个线程,所以使用场景比较受局限。
2. Exchanger使用
Exchanger使用很简单,主要是依靠了exchange(V)方法实现的,该方法也是一个阻塞方法。具体代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Exchanger;
/** * Exchanger:两个线程内的数据交换 */
public class UseExchange {
static Exchanger<String[]> exchanger = new Exchanger<>();
static class ThreadOne implements Runnable {
@Override
public void run() {
String[] list = new String[]{ "你好1","你好2","你好3","你好4"};
try {
System.out.println("线程"+Thread.currentThread().getName()+"交换之前的数据为"+ Arrays.toString(list));
list = exchanger.exchange(list);
System.out.println("线程"+Thread.currentThread().getName()+"交换之后的数据为"+Arrays.toString(list));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class ThreadTwo implements Runnable {
@Override
public void run() {
String[] list = new String[]{ "我好1","我好2","我好3","我好4"};
try {
System.out.println("线程"+Thread.currentThread().getName()+"交换之前的数据为"+Arrays.toString(list));
list = exchanger.exchange(list);
System.out.println("线程"+Thread.currentThread().getName()+"交换之后的数据为"+Arrays.toString(list));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Thread(new ThreadOne()).start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(new ThreadTwo()).start();
}
}
运行结果:
线程Thread-0交换之前的数据为[你好1, 你好2, 你好3, 你好4]
线程Thread-1交换之前的数据为[我好1, 我好2, 我好3, 我好4]
线程Thread-1交换之后的数据为[你好1, 你好2, 你好3, 你好4]
线程Thread-0交换之后的数据为[我好1, 我好2, 我好3, 我好4]
因为Exchanger很少使用,这里只做了解。
还没有评论,来说两句吧...