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

Java 多線程實戰:模擬網路非同步傳輸與主線程解耦

     編輯:Java 相關知識

為什麼網路通訊必須另開線程?

網路 I/O 涉及跨機器通訊,延遲不可控(從幾毫秒到數秒)。若在主線程(UI 線程)直接呼叫 socket.send(),整個程式會卡住,使用者介面凍結、點擊無反應。解決之道:**將耗時的網路操作放入獨立工作線程,主線程專心處理使用者互動**。

架構設計:一個經典的「生產者-消費者」雛形

  • 主線程:循環讀取控制台輸入 → 封裝成任務 → 交給工作線程 → 立即繼續等待下一筆輸入。
  • 工作線程:接收任務 → 模擬網路延遲 → 完成發送 → 線程結束。

完整代碼實現

測試類:主線程持續接收輸入

import java.io.*;

public class TestNet {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input;
        try {
            while (true) {
                System.out.print("請輸入內容(quit退出):");
                input = br.readLine(); // 阻塞等待使用者輸入
                if ("quit".equals(input)) break;
                
                // 關鍵:new 一個線程並立即 start,主線程不等待
                new NetDemoThread(input); 
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try { br.close(); } catch (IOException ignored) {}
        }
    }
}

工作線程:繼承 Thread 實現發送邏輯

public class NetDemoThread extends Thread {
    private final String data;
    public NetDemoThread(String data) { this.data = data; start(); }
    
    @Override
    public void run() {
        try {
            System.out.println("開始發送");
            Thread.sleep(10000); // 模擬 10 秒網路延遲
            System.out.println("發送完成,內容:" + data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

執行流程演示


請輸入內容(quit退出):
abc
請輸入內容(quit退出):
開始發送
123
請輸入內容(quit退出):
開始發送
tbc
請輸入內容(quit退出):
開始發送
faga
請輸入內容(quit退出):
開始發送
發送完成,發送的內容是:abc
hfsd
請輸入內容(quit退出):
開始發送
發送完成,發送的內容是:123
發送完成,發送的內容是:tbc
發送完成,發送的內容是:faga
發送完成,發送的內容是:hfsd
quit

關鍵觀察與啟發

  1. 非阻塞提交:主線程印出「開始發送」後立即回到 readLine() 等待下一筆輸入,完全不等待網路完成。
  2. 多線程並發:輸入越快,同時存活的 NetDemoThread 越多,彼此獨立運行、互不干擾。
  3. 程式退出機制:輸入 quit 結束主線程迴圈,但 JVM 不會立即退出——它會等待所有非守護線程(包括正在發送的工作線程)自然結束。

進階思考:生產環境的改進方向

  • 線程池:頻繁 new Thread 開銷大,應使用 ExecutorService 管理固定大小線程池。
  • 任務隊列:引入 BlockingQueue 解耦「提交」與「執行」,支援背壓控制。
  • 異步回調 / Future / CompletableFuture:取得發送結果、重試、超時控制等更豐富的語義。
  • NIO / Netty:高併發場景下避免「一連接一線程」模式,改用事件驅動非阻塞 I/O。

總結

這個簡單示例展示了多線程解耦「提交任務」與「執行任務」的核心思想。掌握這一模式,是寫出高響應、高吞吐網路應用的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved