1. 程式人生 > >12.線程通信CyclicBarrier

12.線程通信CyclicBarrier

ava rand ont rup executor generated color execute working

CountDownLatch

監聽某個線程的初始化,等待初始化執行完畢後,通知主線程工作。延遲、阻塞的是主線程,在單個線程中。

CyclicBarrier

針對多個線程、線程池,多個線程初始化準備之後,去操作同一件事件(必須一定要所有準備才可執行,通知各的主線程去執行正常工作)。

  1. package demo2;
  2. import java.util.Random;
  3. import java.util.concurrent.BrokenBarrierException;
  4. import java.util.concurrent.CyclicBarrier;
  5. import java.util.concurrent
    .ExecutorService;
  6. import java.util.concurrent.Executors;
  7. /**
  8. * Created by liudan on 2017/7/30.
  9. */
  10. public class DemoCyclicBarrier {
  11. /**
  12. * 假設一個場景:3個運動員,當跑步運動員準備好了,才一起出發
  13. */
  14. static class Runner implements Runnable {
  15. private CyclicBarrier CYCLIC_BARRIER;
  16. private String name;
  17. public
    Runner(CyclicBarrier CYCLIC_BARRIER, String name) {
  18. this.CYCLIC_BARRIER = CYCLIC_BARRIER;
  19. this.name = name;
  20. }
  21. @Override
  22. public void run() {
  23. try {
  24. Thread.sleep(1000 * (new Random().nextInt(5)));
  25. System.err.println(name
    + "\t準備好了");
  26. CYCLIC_BARRIER.await();
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. } catch (BrokenBarrierException e) {
  30. e.printStackTrace();
  31. }
  32. System.err.println("Go!");
  33. }
  34. public static void main(String[] args) {
  35. CyclicBarrier CYCLIC_BARRIER = new CyclicBarrier(3);
  36. ExecutorService executorService = Executors.newFixedThreadPool(3);
  37. executorService.execute(new Runner(CYCLIC_BARRIER, "1號"));
  38. executorService.execute(new Runner(CYCLIC_BARRIER, "2號"));
  39. executorService.execute(new Runner(CYCLIC_BARRIER, "2號"));
  40. executorService.shutdown();
  41. }
  42. }
  43. }
  44. 輸出:
  45. 1號 準備好了 2號 準備好了 2號 準備好了 Go! Go! Go!

案例2
  1. public class TestCyclicBarrier {
  2. private static final int THREAD_NUM = 5;
  3. public static class WorkerThread implements Runnable{
  4. CyclicBarrier barrier;
  5. public WorkerThread(CyclicBarrier b){
  6. this.barrier = b;
  7. }
  8. @Override
  9. public void run() {
  10. // TODO Auto-generated method stub
  11. try{
  12. System.out.println("Worker‘s waiting");
  13. //線程在這裏等待,直到所有線程都到達barrier。
  14. barrier.await();
  15. System.out.println("ID:"+Thread.currentThread().getId()+" Working");
  16. }catch(Exception e){
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21. /**
  22. * @param args
  23. */
  24. public static void main(String[] args) {
  25. // TODO Auto-generated method stub
  26. CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
  27. //當所有線程到達barrier時執行
  28. @Override
  29. public void run() {
  30. // TODO Auto-generated method stub
  31. System.out.println("Inside Barrier");
  32. }
  33. });
  34. for(int i=0;i<THREAD_NUM;i++){
  35. new Thread(new WorkerThread(cb)).start();
  36. }
  37. }
  38. }
  39. /*
  40. 以下是輸出:
  41. Worker‘s waiting
  42. Worker‘s waiting
  43. Worker‘s waiting
  44. Worker‘s waiting
  45. Worker‘s waiting
  46. Inside Barrier
  47. ID:12 Working
  48. ID:8 Working
  49. ID:11 Working
  50. ID:9 Working
  51. ID:10 Working
  52. */



null

12.線程通信CyclicBarrier