日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发编程--6.Exchanger线程间交换数据

發布時間:2025/6/17 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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线程间交换数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。