交易中間件(如 IBM IMS TM)作為核心交易層,需承受高併發連接衝擊。測試其新功能——TCPIPQ 連接緩衝隊列與Health Report 連接占用率上報——要求模擬成百上千客戶端並發建立 Socket 連接,並精確控制連接建立時序以觸發邊界條件(如隊列滿、連接數達上限)。手工啟動客戶端顯然不現實,Java 多線程成為自動化測試的必然選擇。
採用 Runnable 接口而非繼承 Thread,便於客戶端類繼承其他工具類實現複雜協議封裝。
class SocketClient extends Utility implements Runnable {
private String hostName;
private int port;
public SocketClient(String hostName, int port) { ... }
public void run() {
try {
InetAddress addr = InetAddress.getByName(hostName);
Socket socket = new Socket(addr, port);
// 發送協議數據:Head + Body + Foot
OutputStream os = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
bos.write(getHeadData("aaa","bbb","ccc"));
bos.write(getBodyData("ddd","eee","fff"));
bos.write(getFootData("ggg","hhh","iii"));
bos.flush();
} catch (IOException e) { e.printStackTrace(); }
}
}
public void testScenario1() {
for (int i=1; i<=connectionNumb; i++) {
SocketClient sc = new SocketClient(hostName, port);
new Thread(sc, "Client"+i).start();
}
// 此處執行具體測試邏輯...
}
缺陷:線程依次 start(),無法保證「同一起跑線」並發衝擊,導致伺服器端連接數緩慢上升,難以瞬間達到峰值觸發 Health Report 為 0 或 TCPIPQ 入隊邏輯。
JDK 5 引入的 CountDownLatch 完美解決協調問題:
startCdl,主線程 countDown() 瞬間釋放所有工作線程。doneCdl,每個工作線程結束 countDown(),主線程 await() 等待全部完成。class ThreadTest implements Runnable {
private static CountDownLatch startCdl, doneCdl;
public ThreadTest(CountDownLatch start, CountDownLatch done) {
this.startCdl = start; this.doneCdl = done;
}
public void run() {
try {
startCdl.await(); // 等待閘門打開
System.out.println(Thread.currentThread().getName() + " has been working!!!!");
// 執行 Socket 連接與發送邏輯...
doneCdl.countDown();
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
public class CountDownLatchDemo1 {
public static void main(String[] args) {
CountDownLatch startCdl = new CountDownLatch(1);
CountDownLatch doneCdl = new CountDownLatch(100);
for (int i=1; i<=100; i++) {
new Thread(new ThreadTest(startCdl, doneCdl), "Thread"+i).start();
}
long start = System.nanoTime();
startCdl.countDown(); // 開閘!
doneCdl.await(); // 等待全部完成
long end = System.nanoTime();
System.out.println("Task takes time(ms): " + (end-start)/1_000_000);
}
}
實測中,IMS Connect 最大連接數設為 100,啟動 100 線程瞬間衝擊,Health Report 從 95 降為 000,成功觸發峰值告警;繼續發送 50 請求進入 TCPIPQ 隊列,驗證入隊/出隊邏輯。
JDK 5+ 提供豐富同步器,Exchanger 可讓兩組線程交換數據,模擬「連接器」與「釋放器」對共享隊列的操作。
public class ConnectionQueueDemo {
private static Exchanger<LinkedList<Connection>> exconn = new Exchanger<>();
public class Connector implements Runnable {
public void run() {
while (true) {
int connNumb = new Random().nextInt(2) + 1; // 1 or 2
for (int i=0; i
後台輸出清晰展示隊列大小動態變化,最終達到上限觸發測試斷點(見下圖)。

Runnable + Thread 適合簡單獨立任務。CountDownLatch 實現啟動同步、CyclicBarrier 適合階段性匯聚、Semaphore 控制資源訪問併發度。Exchanger 適用於生產-消費、雙緩衝等場景。ExecutorService 管理線程生命周期,避免頻繁創建銷毀開銷。Phaser、ForkJoinPool、TransferQueue 為更複雜協調提供原語,掌握 JDK 5 基礎後遷移無門檻。通過 Java 並發工具包,測試人員能以極低成本構建高保真壓力模型,精準覆蓋中間件邊界條件,大幅提升測試效率與質量。