前段時間在做java多線程,然后涉及到了一個效率的問題。
java多線程中,所有線程執行完畢,總共使用多少時間呢?
import java.util.concurrent.CountDownLatch;
countDwonlatch提供了最常用的一些測試方法。
創建一個countDownLatch對象:
CountDownLatch countDownLatch = new CountDownLatch(500); //這個構造函數的入參為 int num,表示當前線程的總數,這500就表示有500個線程
countDownLatch.countDown(); //這個方法執行 會使總線程數-1,比如上面總線程為500,執行這個方法后為499,然后直到數量為0時,主線程從掛起狀態恢復。
countDownLatch.await(); //將主線程掛起等待,知道countDown()將總數量變成0時,恢復主線程。
這里要注意的是,countDownLatch.await();會導致程序直接掛起,后面代碼不再執行,所有如果你countDown()無效時,可能你提前await()該線程。
正確的使用方式是,要全部的(充分的)執行完countDwon();后在緊跟await();
下面列出代碼:
public class threadTimtCount implements Runnable { static long startTime = System.currentTimeMillis();// 開始時間 final static CountDownLatch countDownLatch = new CountDownLatch(500); public static void main(String[] args) throws InterruptedException { threadTimtCount count = new threadTimtCount(); for (int i = 1; i <= 500; i++) { Thread thread = new Thread(count); thread.start();
//countDownLatch.await(); 錯誤的寫法,這會導致thread執行一遍之后,線程被掛起,然后第二次for循環無法執行了(程序掛起等待),這樣造成程序假死(卡死) } countDownLatch.await(); //一定要等到countDown()方法執行完畢后才使用 System.out.println("執行總時間:"+(System.currentTimeMillis()-startTime)); } @Override public void run() { try { Thread.sleep(timeIndex); System.out.println("currThread " + Thread.currentThread().getName()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ countDownLatch.countDown(); } } }
