首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 管道流實現執行緒間通訊:原理與實戰範例

     編輯:Java 程式設計入門

管道流簡介

Java 提供豐富的輸入輸出流,其中管道流是一種特殊機制,用於不同執行緒間直接傳遞資料。一個執行緒寫入輸出管道,另一個執行緒從輸入管道讀取,無需臨時檔案等中介媒介。本文將介紹管道基本概念,並以 pipeapp 實例詳細說明。

管道的建立與使用

Java 提供兩個專門類別處理管道:

  • PipedInputStream:管道輸出端,執行緒從管道讀取資料
  • PipedOutputStream:管道輸入端,執行緒向管道寫入資料

建立管道流步驟:

PipedOutputStream pipeOut = new PipedOutputStream();
PipedInputStream pipeIn = new PipedInputStream(pipeOut);

建立後即可像操作檔案一樣進行資料讀寫。

實戰範例:pipeapp 應用程式

程式由三個執行緒組成:主執行緒 pipeapp.java 及其啟動的兩個次級執行緒 ythread.java、zthread.java。流程如下:

  1. 從 input.txt(每行為 "x")讀取資料
  2. 執行緒 ythread 將 "x" 轉換為 "y"
  3. 執行緒 zthread 將 "y" 轉換為 "z"
  4. 主執行緒顯示最終結果

主執行緒邏輯

// 建立檔案輸入流
FileInputStream xFileIn = new FileInputStream("input.txt");

// 啟動 ythread,取得其輸出管道(作為下一階段輸入)
InputStream yInPipe = pipeApp.changeToY(xFileIn);

// 啟動 zthread,取得最終輸入管道
InputStream zInPipe = pipeApp.changeToZ(yInPipe);

// 讀取並顯示結果
DataInputStream inputStream = new DataInputStream(zInPipe);
String str;
while ((str = inputStream.readLine()) != null) {
    System.out.println(str);
}
inputStream.close();

changeToY() 方法

// 定位輸入流
DataInputStream xFileIn = new DataInputStream(inputStream);

// 建立管道
PipedOutputStream pipeOut = new PipedOutputStream();
PipedInputStream pipeIn = new PipedInputStream(pipeOut);

// 將輸出管道包裝為 PrintStream 方便寫入
PrintStream printStream = new PrintStream(pipeOut);

// 建立並啟動 ythread
YThread yThread = new YThread(xFileIn, printStream);
yThread.start();

return pipeIn; // 返回輸入管道供下一階段使用

changeToZ() 方法

邏輯與 changeToY() 類似,接收上一階段輸入管道,建立新管道,啟動 ZThread 將 "y" 轉為 "z",返回最終輸入管道。

關鍵點總結

  • 管道實現執行緒間零拷貝資料傳遞
  • PipedInputStream 與 PipedOutputStream 必須配對使用
  • 實際應用中需注意死鎖風險(如單執行緒同時讀寫同一管道)
  • 適用於生產者-消費者模式的資料流水線處理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved