码迷,mamicode.com
首页 > 编程语言 > 详细

秒杀多线程之CyclicBarrier

时间:2014-11-05 18:55:16      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   ar   java   sp   div   on   

CyclicBarrier是用来一个关卡来阻挡住所有线程,等所有线程全部执行到关卡处时,再统一执行下一步操作。

package com.multithread.cyclicbarrier;

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.multithread.main.ExampleInterface;

public class CyclicBarrierExample extends ExampleInterface {

    @Override
    public void startDemo() {
         System.out.println("开始线程:"+Thread.currentThread().getId());
        // TODO Auto-generated method stub
        final CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {

            /*
             * 运行在最后一个await到达的线程,不是主线程!
             * */
            @Override
            public void run() {
                System.out.println("所有选手ready"+"线程:"+Thread.currentThread().getId());
            }
        });
        
        ExecutorService executor = Executors.newFixedThreadPool(3); 
        executor.submit(new Thread(new Runner(barrier, "1号选手")));  
        executor.submit(new Thread(new Runner(barrier, "2号选手")));  
        executor.submit(new Thread(new Runner(barrier, "3号选手")));  
  
        executor.shutdown();
    }

}

package com.multithread.cyclicbarrier;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class Runner implements Runnable {

     // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)  
    private CyclicBarrier barrier;  
  
    private String name;  
  
    public Runner(CyclicBarrier barrier, String name) {  
        super();  
        this.barrier = barrier;  
        this.name = name;  
    }  
  
    @Override  
    public void run() {  
        try {  
            Thread.sleep(1000 * (new Random()).nextInt(8));  
            System.out.println(name + " 准备好了..."+"线程:"+Thread.currentThread().getId());  
            // barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。  
            barrier.await();  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        } catch (BrokenBarrierException e) {  
            e.printStackTrace();  
        }  
        System.out.println(name + " 起跑!"+"线程:"+Thread.currentThread().getId());  
    }  
}

运行结果:

开始线程:1
3号选手 准备好了...线程:14
1号选手 准备好了...线程:10
2号选手 准备好了...线程:12
所有选手ready线程:12
2号选手 起跑!线程:12
3号选手 起跑!线程:14
1号选手 起跑!线程:10

 

秒杀多线程之CyclicBarrier

标签:style   blog   io   color   ar   java   sp   div   on   

原文地址:http://www.cnblogs.com/deman/p/4076787.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!