Java|CountDownLatch

#Java #多线程 [字体 ··]

CountDownLatch 是一个线程栓子,当计数到达 0 释放所有线程运行,它只能使用一次,CyclicBarrier 可以使用多次。

示例一

 1public class CountDownLatchUtil {
 2    private CountDownLatch start;
 3    private CountDownLatch end;
 4    private int poolSize;
 5
 6    public CountDownLatchUtil() {
 7        this(10);
 8    }
 9
10    public CountDownLatchUtil(int poolSize) {
11        this.poolSize = poolSize;
12        start = new CountDownLatch(1);
13        end = new CountDownLatch(poolSize);
14    }
15
16    public void latch(MyFunctionalInterface functionalInterface) throws InterruptedException {
17        ExecutorService service = Executors.newFixedThreadPool(poolSize);
18        for (int i = 0; i < poolSize; i++) {
19            Runnable runnable = new Runnable() {
20
21                @Override
22                public void run() {
23                    try {
24                        start.await();
25                        functionalInterface.run();
26                    } catch (InterruptedException e) {
27                        e.printStackTrace();
28                    } finally {
29                        end.countDown();
30                    }
31                }
32            };
33            service.execute(runnable);
34        }
35        // start all task
36        start.countDown();
37        // wait until all task finish
38        end.await();
39    }
40
41    @FunctionalInterface
42    public interface MyFunctionalInterface {
43        void run();
44    }
45}

示例二

 1  class Driver { // ...
 2    void main() throws InterruptedException {
 3      CountDownLatch startSignal = new CountDownLatch(1);
 4      CountDownLatch doneSignal = new CountDownLatch(N);
 5
 6      for (int i = 0; i < N; ++i) // create and start threads
 7        new Thread(new Worker(startSignal, doneSignal)).start();
 8
 9      doSomethingElse();            // don't let run yet
10      startSignal.countDown();      // let all threads proceed
11      doSomethingElse();
12      doneSignal.await();           // wait for all to finish
13    }
14  }
15
16  class Worker implements Runnable {
17    private final CountDownLatch startSignal;
18    private final CountDownLatch doneSignal;
19    Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
20      this.startSignal = startSignal;
21      this.doneSignal = doneSignal;
22    }
23    public void run() {
24      try {
25        startSignal.await();
26        doWork();
27        doneSignal.countDown();
28      } catch (InterruptedException ex) {} // return;
29    }
30
31    void doWork() { ... }
32  }

示例三

 1  class Driver2 { // ...
 2    void main() throws InterruptedException {
 3      CountDownLatch doneSignal = new CountDownLatch(N);
 4      Executor e = ...
 5
 6      for (int i = 0; i < N; ++i) // create and start threads
 7        e.execute(new WorkerRunnable(doneSignal, i));
 8
 9      doneSignal.await();           // wait for all to finish
10    }
11  }
12
13  class WorkerRunnable implements Runnable {
14    private final CountDownLatch doneSignal;
15    private final int i;
16    WorkerRunnable(CountDownLatch doneSignal, int i) {
17      this.doneSignal = doneSignal;
18      this.i = i;
19    }
20    public void run() {
21      try {
22        doWork(i);
23        doneSignal.countDown();
24      } catch (InterruptedException ex) {} // return;
25    }
26
27    void doWork() { ... }
28  }


博客没有评论系统,可以通过 邮件 评论和交流。