文档章节

关卡CyclicBarrier的使用

隆回水哥
 隆回水哥
发布于 2015/05/27 18:11
字数 267
阅读 56
收藏 2

有时线程之间需要同步。现有如下要求

多线程执行job的两个方法:所有doJob1()执行完之后,doJob2()才开始执行。

package com.wss.lsl.test.driven.runnable;

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

/**
 * 多线程执行job的两个方法:所有doJob1()执行完之后,doJob2()才开始执行.
 * <p>
 * 使用关卡实现,doJob1()执行完之后,在关卡等待,直到最后一个线程执行完才打开关卡
 * </p>
 * 
 * @author Administrator
 * 
 */
public class Job {

    public void doJob1() {
        System.out.println("doJob1");
    }

    public void doJob2() {
        System.out.println("doJob2");
    }

    public void run(int threadCount) {
        CyclicBarrier entryBarrier = new CyclicBarrier(threadCount);
        CyclicBarrier exitBarrier = new CyclicBarrier(threadCount + 1);
        for (int i = 0; i < threadCount; i++) {
            new Thread(new RunJob(this, entryBarrier, exitBarrier)).start();
        }
        try {
            exitBarrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }

    static class RunJob implements Runnable {

        private Job job;
        // 进入的关卡
        private CyclicBarrier entryBarrier;
        // 退出的关卡
        private CyclicBarrier exitBarrier;

        public RunJob(Job job, CyclicBarrier entryBarrier,
                CyclicBarrier exitBarrier) {
            super();
            this.job = job;
            this.entryBarrier = entryBarrier;
            this.exitBarrier = exitBarrier;
        }

        @Override
        public void run() {
            try {
                job.doJob1();
                // 在关卡等待,直到所有的doJob1执行完
                entryBarrier.await();
                job.doJob2();
                // 配合主线程退出,避免主线程退出而导致程序关闭
                exitBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }

    }
}


© 著作权归作者所有

隆回水哥
粉丝 14
博文 49
码字总数 18518
作品 0
深圳
高级程序员
私信 提问
java并发编程中CountDownLatch和CyclicBarrier的使用

java并发编程中CountDownLatch和CyclicBarrier的使用 在多线程程序设计中,经常会遇到一个线程等待一个或多个线程的场景,遇到这样的场景应该如何解决? 如果是一个线程等待一个线程,则可以...

zmf
2015/09/06
300
0
countDownLatch 与 CyclicBarrier 区别

我自己的理解: 假如有8个运动员和一个教练。 countDownLatch : 每个运动员跑完了通知了教练自己就可以做其他事情去了,然后教练必须等8个运动员都跑完了才能统计成绩。(教练等待) Cyclic...

凉粉
2015/10/29
26
0
JUC学习之CountDownLatch

package countDownLatch; import java.util.ArrayList;import java.util.List;import java.util.concurrent.CountDownLatch; /** * CountDownLatch类是一个同步计数器,构造时传入int参数,该参......

james_you
2014/05/04
227
0
CyclicBarrier让多线程齐步走

从JDK 1.5之后,在java.util.concurrent包下引入了好多的处理多线程的工具类,本文首先会介绍CyclicBarrier辅助工具类,其次将用CyclicBarrier工具类来完成一个实例,最后将给出CyclicBarri...

王孟君
2016/11/06
84
0
多线程-AQS-CyclicBarrier

1、CyclicBarrier和CountDownLatch的区别 CountDownLatch是闭锁,只能使用一次,而CyclicBarrier的计数器会重置,可以使用多次,所以CyclicBarrier能够处理更为复杂的场景; CyclicBarrier还提...

重城重楼
05/08
15
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
10
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
1K
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部