2019独角兽企业重金招聘Python工程师标准>>>
1、介绍
两个线程之间进行数据的共享,有几种方式:
-
1、redis、kafka等第三方消息系统
-
2、线程都共同拥有一个list、queue等容器对象 上面这两种都是线程之间,你发送给我,我发送给你,都是一方给另外一方的,而有的场景,我们是需要
-
3、两个线程相互同时给对方数据,也就是交换数据,怎么实现呢?
使用 Exchanger
2、代码
import java.util.concurrent.Exchanger;/*** 两个线程之间数据交换* 1、执行exchange方法会阻塞* 2、交换数据不是简单的将另一个线程数据对象的引用传递回来,而是新建一个对象* * [@Author](https://my.oschina.net/arthor) liufu* [@Company](https://my.oschina.net/u/3478402) 任子行网络技术股份有限公司* @CreateTime 2018/3/23 11:11*/
public class ExchangerTest {public static void main(String[] args) throws InterruptedException {Exchanger<String[]> exchanger = new Exchanger<>();new Thread(() -> {String[] arr1 = new String[2];arr1[0] = "1";arr1[1] = "2";try {// exchange方法返回一个全新的数组对象,而不是把下一个线程的引用返回来String[] arr2 = exchanger.exchange(arr1);System.out.println(arr2 == arr1);} catch (InterruptedException e) {e.printStackTrace();}}).start();//等待10秒钟,是为了看上面线程执行exchange时是否会等待Thread.sleep(10000);new Thread(() -> {String[] arr1 = new String[3];arr1[0] = "3";arr1[1] = "4";arr1[2] = "5";try {String[] arr2 = exchanger.exchange(arr1);System.out.println(arr2 == arr1);} catch (InterruptedException e) {e.printStackTrace();}}).start();}
}