通過閉鎖方式實現多執行緒同時併發測試
閉鎖是一種同步工具類,可以延遲執行緒的進度直到其達到終止狀態。形象一點就是,閉鎖就是一扇關閉的大門,在閉鎖達到結束條件之前,這扇門是關閉的,沒有任何執行緒可以通過。而一旦條件達到,就像開閘洩洪一樣,萬馬奔騰,瞬間達到高併發。在此我希望模擬高併發的瞬間,而不是依次的啟動執行緒,讓其相對依次的不可控執行。當然,這只是一種使用的方法,更多的使用閉鎖可以確保某些活動直到其他活動都完成後才繼續執行。
CountDownLatch是一種靈活的閉所實現。閉鎖狀態包括一個計數器,可以初始化為一個正數,表示需要等待的時間數量,countdown方法遞減計數器,表示一個事件已經發生。await方法等待計數器為零,表示所有時間已經發生。如果計數器非零,則await會一直阻塞,知道計數器為零,或者執行緒中斷,等待超時。
public class CountDownLatchDemo extends Thread {
public static CountDownLatch startGate = new CountDownLatch(1);
public static CountDownLatch endGate = new CountDownLatch(2000);
private String name;
public CountDownLatchDemo(String name) {
this.name = name;
}
public void run() {
try {
startGate.await();
// do what you want
System.out.println(Thread.currentThread().getName() + "=" + name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
endGate.countDown();
}
}
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 2000; i++) {
CountDownLatchDemotd = new CountDownLatchDemo(String.valueOf(i));
td.start();
}
long start = System.nanoTime();
CountDownLatchDemo.startGate.countDown();
CountDownLatchDemo.endGate.await();
long end = System.nanoTime();
System.out.println("time is " + String.valueOf(end - start));
}
}