最近看到公司的一個同事寫了一個程序對我們的服務器進行並發測試,看了他代碼令我很抓狂,他用一個for循環,然後分別啟動線程進行就搞定,類似這樣的寫法:
for(int i=0;i<5000;i++){
Thread thread = new MyThread();
thread.start();
}
上面的寫法其實不是真正的並發測試,沒有實現對5000個線程進行同步,讓它們進行並發啟動.因為之前看了《Java並發編程實戰》,看了裡面對一種同步工具閉鎖的介紹,利用這個類就可以實現真正的並發程序測試.
閉鎖:一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。即,一組線程等待某一事件發生,事件沒有發生前,所有線程將阻塞等待;而事件發生後,所有線程將開始執行;閉鎖最初處於封閉狀態,當事件發生後閉鎖將被打開,一旦打開,閉鎖將永遠處於打開狀態。
下面我寫了一個類,利用閉鎖(CountDownLatch)來實現對本網站並發進行測試.
package com.thred;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class ThreadTest {
public static void main(String[] args) {
final int num = 10;
final CountDownLatch begin = new CountDownLatch(1);
final CountDownLatch end = new CountDownLatch(num);
for (int i = 0; i < num; i++) {
new Thread(new MyWorker(i, begin, end)).start();
}
// 睡眠十秒
try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("開始進行並發測試");
begin.countDown();
long startTime = System.currentTimeMillis();
try {
end.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
long endTime = System.currentTimeMillis();
System.out.println("結束並發測試 !");
System.out.println("花費