引言
对于java中线程的使用,学习java的同学应该都不陌生吧!那在java中有没有一个可以很简单的方法实现线程中数据共享呢?下面正式请出CyclicBarrier。
CyclicBarrier的使用场景
需要等待子任务执行完,才执行主程序的案例。
经典使用案例:
在多线程中实现count加1,然后统计结果打印出来。我们都知道,多个线程在启动之后是不会按顺序执行的,在java的current包下就直接提供了CyclicBarrier供我们使用,不多说,直接上代码。
public class TestCyclicBarrier { private static final int THREAD_NUM = 5;//定义的线程个数 private static int sum = 0; //统计值 public static class JobThread implements Runnable { CyclicBarrier cyclicBarrier; public JobThread(CyclicBarrier cyclicBarrier) { this.cyclicBarrier = cyclicBarrier; } public void run() { try { sum++;//在每个线程中做+1操作 System.out.println("当前线程的名字为:" + Thread.currentThread().getName() + " 当前的sum的值为:" + sum); /* 英文解释:Waits until all {@linkplain #getParties parties} have invoke * {@code await} on this barrier. 翻译一下:线程到这里等待,到了这个barrier才被调用 */ cyclicBarrier.await(); //System.out.println("id:"+Thread.currentThread().getId()+" name:"+Thread.currentThread().getName()+"is working..."); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } public static void main(String[] args) { CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() { public void run() { System.out.println("我等待这些线程全部到达准备就绪之后才执行。。。。。"); System.out.println("线程执行完之后的结果为:" + sum); } }); for (int i = 0; i < THREAD_NUM; i++) { JobThread job = new JobThread(cb); Thread t = new Thread(job); t.start(); } } }执行结果如下:
当前线程的名字为:Thread-0 当前的sum的值为:1
当前线程的名字为:Thread-1 当前的sum的值为:2
当前线程的名字为:Thread-2 当前的sum的值为:3
当前线程的名字为:Thread-4 当前的sum的值为:4
当前线程的名字为:Thread-3 当前的sum的值为:5
我等待这些线程全部到达准备就绪之后才执行。。。。。
线程执行完之后的结果为:5
说明
其中THREAD_NUM是线程的个数,这里在main方法中手动创建了5个线程,他们的不是按顺序执行的,还是谁先抢到锁,谁先执行。他们各自执行sum加1操作。最后得到各个线程加1的结果。其实业务操作放在Jobwork 的cyclcBarrier.await()就可以了。
注意:如果在for循环中修改条件i,i的值如果不是THREAD_NUM的倍数,线程会被锁,一直等待执行。