網路 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) {}
}
}
}
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
readLine() 等待下一筆輸入,完全不等待網路完成。NetDemoThread 越多,彼此獨立運行、互不干擾。quit 結束主線程迴圈,但 JVM 不會立即退出——它會等待所有非守護線程(包括正在發送的工作線程)自然結束。new Thread 開銷大,應使用 ExecutorService 管理固定大小線程池。BlockingQueue 解耦「提交」與「執行」,支援背壓控制。這個簡單示例展示了多線程解耦「提交任務」與「執行任務」的核心思想。掌握這一模式,是寫出高響應、高吞吐網路應用的基石。