掃描大範圍連接埠若逐一建立執行緒,系統資源易耗盡。採用 ExecutorService 固定大小執行緒池,可控制並發數、重用執行緒、提升掃描效率。
private void getLocal() {
String ip = getIP(); // 取得本機 IP
int startPort = Integer.parseInt(txPortStart1.getText().trim());
int endPort = Integer.parseInt(txPortEnd1.getText().trim());
// 參數驗證略...
scan(ip, startPort, endPort);
runThread(); // 監控掃描完成
}
private void scan(String ip, int startPort, int endPort) {
setBtnEdit(false);
status.setText("掃描中...");
table.addRow(new String[]{ip, ""});
ExecutorService exec = Executors.newFixedThreadPool(10); // 固定 10 條執行緒
for (int port = startPort; port <= endPort; port++) {
exec.execute(new RunSocket(ip, port)); // 提交掃描任務
}
exec.shutdown(); // 不再接受新任務,等待現有任務完成
}
RunSocket (概念)class RunSocket implements Runnable {
private String ip;
private int port;
public RunSocket(String ip, int port) { this.ip = ip; this.port = port; }
@Override
public void run() {
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress(ip, port), 1000); // 1秒逾時
// 連線成功 -> 更新 UI 顯示開放連接埠
SwingUtilities.invokeLater(() -> table.addRow(new String[]{ip, String.valueOf(port)}));
} catch (IOException ignored) { /* 連線失敗視為關閉 */ }
}
}
ExecutorService 封裝生命週期管理,業務邏輯專注於掃描本身。