java 多線程(十五)

package com.thread.threadTest;


import jdk.internal.org.objectweb.asm.tree.IntInsnNode;

import javax.xml.transform.Source;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 同步工具類
 * 1.CyclicBarrier:多個線程在不同時刻到達指定集合點後,接着去執行別的任務.
 *   到達指定集合點用CyclicBarrier對象的await方法表示。
 *
 */
public class CyclicBarrierTest {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);

        for(int i=0;i<3;i++){
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep((long) (Math.random()*10000));
                        System.out.println("線程"+Thread.currentThread().getName()+"即將到達集合地點一,當前已有"+(cyclicBarrier.getNumberWaiting()+1)+"個已經到達");
                        cyclicBarrier.await();
                        Thread.sleep((long) (Math.random()*10000));
                        System.out.println("線程"+Thread.currentThread().getName()+"即將到達集合地點二,當前已有"+(cyclicBarrier.getNumberWaiting()+1)+"個已經到達");
                        cyclicBarrier.await();
                        Thread.sleep((long) (Math.random()*10000));
                        System.out.println("線程"+Thread.currentThread().getName()+"即將到達集合地點三,當前已有"+(cyclicBarrier.getNumberWaiting()+1)+"個已經到達");
                        cyclicBarrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            };
            executorService.execute(runnable);
        }
        executorService.shutdown();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章