1. 程式人生 > >java CountDownLatch 使用介紹

java CountDownLatch 使用介紹

arr 服務 port tac logs 能夠 rri 子線程 bsp

CountDownLatch是在java1.5被引入的,跟它一起被引入的並發工具類還有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它們都存在於java.util.concurrent包下。CountDownLatch這個類能夠使一個線程等待其他線程完成各自的工作後再執行。例如,應用程序的主線程希望在負責啟動框架服務的線程已經啟動所有的框架服務之後再執行。CountDownLatch是通過一個計數器來實現的,計數器的初始值為線程的數量。每當一個線程完成了自己的任務後,計數器的值就會減1。當計數器值到達0時,它表示所有的線程已經完成了任務,然後在閉鎖上等待的線程就可以恢復執行任務。

舉例說明:假如我們有10個excel文檔,每個文檔中都有一個銀行一年的流水記錄,我們想要匯總這些文檔中所有數據,求出你的均流水記錄就可以考慮使用CountDownLatch

偽代碼如下:

public class Work implements Runnable  {
    private CountDownLatch latch;
    private String msg;
    private int sum=0;
    public Work(String msg, CountDownLatch latch){
        this.msg=msg;
        this.latch=latch;
    }
    public void run() {
        while (true) {
            System.out.print(msg);
            latch.countDown(); //計數器減1
            break;
        }
    }
}
import java.util.concurrent.CountDownLatch;

/**
 * by lv xiao long 
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        //這裏設置計數器的值為2,在子線程中執行兩次countDown操作就會變為0。就會回到主線程
        CountDownLatch countDownLatch=new CountDownLatch(2);
        Work work=new Work("線程1工作完成\n",countDownLatch);
        Thread thread=new Thread(work);
        thread.start();
        work=new Work("線程2工作完成\n",countDownLatch);
        thread=new Thread(work);
        thread.start();
        try {
            countDownLatch.await();
            System.out.println( "所有工作已完成!\n" );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

java CountDownLatch 使用介紹