java 多线程-障栅CyclicBarrier

来源:互联网 发布:可靠性软件 编辑:程序博客网 时间:2024/06/07 15:27

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。


public class Test{public static void main(String[] arg){//新建一个障栅,其会阻拦10个线程CyclicBarrier cyclicBarrier = new CyclicBarrier(10);ThreadGroup group = new ThreadGroup("semaphore");//自定义线程组AtomicInteger num = new AtomicInteger(0);ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 10, 1000, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(20), new ThreadFactory() {//线程池工厂@Overridepublic Thread newThread(Runnable r) {//生产新的线程Thread thread = new Thread(group, r, group.getName()+"-thread-"+num.getAndIncrement());thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread t, Throwable e) {System.out.println(t.getName()+"发生异常:"+e.getMessage());}});return thread;}},new RejectedExecutionHandler() {//线程池的拒绝策略@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {throw new RuntimeException("任务队列已满,任务被拒绝");}});//定义任务Runnable task = ()->{System.out.println("遇到了障栅....."+Thread.currentThread().getName()+"即将被阻塞");try {cyclicBarrier.await();System.out.println("障栅放开了....."+Thread.currentThread().getName()+"即将休眠");Thread.sleep(3000);} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}};try {Thread.sleep(8000);} catch (InterruptedException e) {e.printStackTrace();}for(int i = 0; i < 10; i++){//循环运行10个任务try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}pool.execute(task);}if(Thread.activeCount() > 1){Thread.yield();}pool.shutdown();}}




原创粉丝点击