程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java多線程之Exchanger類

java多線程之Exchanger類

編輯:關於JAVA
 

Exchanger這個類,估計大家是很少用到,筆者最近在項目也用到這個類,在項目使用這個類來用於兩個線程進行交換數據緩存,比如一個線程來讀數據,另一個線程在寫入緩存,在這兩個線程中用Exchanger進行交換數據.接下來我寫了一段代碼來說明這個類的使用場景:

package com.thred;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Exchanger;

public class ExchangerTest {

public static void main(String[] args) {
Exchanger<List<String>> exchanger = new Exchanger<List<String>>();
new ReadThread(exchanger).start();// 啟動讀數據線程
new WriteThread(exchanger).start();// 啟動寫數據線程
}

}

class ReadThread extends Thread {
private Exchanger<List<String>> exchanger;
List<String> bufferList = new LinkedList<String>();
public static final Integer BUFFER_SIZE = 10;

public ReadThread(Exchanger<List<String>> exchanger) {
this.exchanger = exchanger;
}

@Override
public void run() {
System.out.println("ReadThread start");
for (int i = 0; i < BUFFER_SIZE; i++) {
bufferList.add(String.valueOf('A' + i)); // 模擬讀數據
}
try {
Thread.sleep(10000);
bufferList = exchanger.exchange(bufferList);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ReadThread end");
}
}

class WriteThread extends Thread {
private Exchanger<List<String>> exchanger;
List<String> bufferList;

public WriteThread(Exchanger<List<String>> exchanger) {
this.exchanger = exchanger;
}

@Override
public void run() {
try {
System.out.println("WriteThread start");
bufferList = exchanger.exchange(bufferList); // 從Exchanger獲得緩存數據
} catch (InterruptedException e) {
e.printStackTrace();
}
for (String str : bufferList) {
System.out.println(str);
}

System.out.println("WriteTread end");

}
}

從上面代碼的運行結果可以看出,當啟動讀線程跟寫線程的時候,在寫線程調用exchanger.exchange(bufferList)的時候會發生阻塞直到有交換數據過來,使用Exchanger這個類比較適合在多線程環境中進行數據交換的場景.

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved