Java并发编程--6.Exchanger线程间交换数据
生活随笔
收集整理的這篇文章主要介紹了
Java并发编程--6.Exchanger线程间交换数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在兩個線程之間定義同步點,當兩個線程都到達同步點時,他們交換數據結構,因此第一個線程的數據結構進入到第二個線程中,第二個線程的數據結構進入到第一個線程中
在生產者-消費者情境模式中它包含了一個數緩沖區,一個或者多個生產者,一個或者多個消費中
?
下面是生產者和消費者的示例:
/*** 生產者和消費者交換數據*/ public class MyExchanger {public static void main(String[] args) {Exchanger<List<String>> exchanger = new Exchanger<List<String>>();Producer1 producer = new Producer1(new ArrayList<String>(), exchanger);Consumer1 consumer = new Consumer1(new ArrayList<String>(), exchanger);new Thread(producer).start();new Thread(consumer).start();} }/** 生產者線程*/class Producer1 implements Runnable{/*** 存儲交換的數據*/private List<String> buffer;/*** 和消費者要交換的對象*/private final Exchanger<List<String>> exchanger;Producer1(List<String> buffer,Exchanger<List<String>> exchanger){this.buffer = buffer;this.exchanger = exchanger;}@Overridepublic void run() {for(int i = 0 ; i < 2 ; i++){String message = "" + i ;System.out.println("Produce的數據 : " + message);buffer.add(message);//調用exchange()與消費者進行數據交換try {buffer = exchanger.exchange(buffer);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("Produce收到來自Consumer的數據的長度 : " + buffer.size());} }/** 消費者線程*/ class Consumer1 implements Runnable{private List<String> buffer;private final Exchanger<List<String>> exchanger;public Consumer1(List<String> buffer,Exchanger<List<String>> exchanger){this.buffer = buffer;this.exchanger = exchanger;}@Overridepublic void run() {for(int i = 0 ; i < 2 ; i++){//調用exchange()與消費者進行數據交換try {buffer = exchanger.exchange(buffer);} catch (InterruptedException e) {e.printStackTrace();}for(int j = 0 ; j < buffer.size() ; j++){System.out.println("Consumer收到來自Produce的數據 : " + buffer.get(0));buffer.remove(0);}}System.out.println("Consumer清空數據");}}控制臺輸出:
Produce的數據 : 0 Consumer收到來自Produce的數據 : 0 Produce的數據 : 1 Produce收到來自Consumer的數據的長度 : 0 Consumer收到來自Produce的數據 : 1 Consumer清空數據在Exchanger中,如果一個線程已經到達了exchanger節點時,對于它的伙伴節點的情況有三種:
1、如果它的伙伴節點在該線程到達之間已經調用了exchanger方法,則它會喚醒它的伙伴然后進行數據交換,得到各自數據返回。
2、如果它的伙伴節點還沒有到達交換點,則該線程將會被掛起,等待它的伙伴節點到達被喚醒,完成數據交換。
3、如果當前線程被中斷了則拋出異常,或者等待超時了,則拋出超時異常
?
轉載于:https://www.cnblogs.com/liuconglin/p/6710688.html
總結
以上是生活随笔為你收集整理的Java并发编程--6.Exchanger线程间交换数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 添加Mysql普通用户来管理hive
- 下一篇: Nginx如何配置虚拟主机?