`
Ydoing
  • 浏览: 106230 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java并发编程之栅栏(CyclicBarrier)详解

 
阅读更多
  • 栅栏类似闭锁,但是它们是有区别的.
    闭锁用来等待事件,而栅栏用于等待其他线程.什么意思呢?就是说闭锁用来等待的事件就是countDown事件,只有该countDown事件执行后所有之前在等待的线程才有可能继续执行;而栅栏没有类似countDown事件控制线程的执行,只有线程的await方法能控制等待的线程执行.

  • CyclicBarrier强调的是n个线程,大家相互等待,只要有一个没完成,所有人都得等着。

场景分析:10个人去春游,规定达到一个地点后才能继续前行.代码如下

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

class CyclicBarrierWorker implements Runnable {
    private int id;
    private CyclicBarrier barrier;

    public CyclicBarrierWorker(int id, final CyclicBarrier barrier) {
        this.id = id;
        this.barrier = barrier;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            System.out.println(id + " th people wait");
            barrier.await(); // 大家等待最后一个线程到达
        } catch (InterruptedException | BrokenBarrierException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public class TestCyclicBarrier {
    public static void main(String[] args) {
        int num = 10;
        CyclicBarrier barrier = new CyclicBarrier(num, new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println("go on together!");
            }
        });
        for (int i = 1; i <= num; i++) {
            new Thread(new CyclicBarrierWorker(i, barrier)).start();
        }
    }
}

输出

1 th people wait
2 th people wait
3 th people wait
4 th people wait
5 th people wait
7 th people wait
8 th people wait
6 th people wait
9 th people wait
10 th people wait
go on together!
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    《java 并发编程实战高清PDF版》

    在Java并发编程中,多线程是核心概念之一。多线程允许程序同时执行多个任务,从而充分利用系统资源,提高程序性能。然而,多线程编程也带来了同步和竞态条件等问题,这需要开发者具备良好的线程管理和同步机制的知识...

    java并发工具包详解

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool ...

    高并发编程实战1,2,3阶段

    - **CyclicBarrier**:循环栅栏,多个线程等待到达某一点后继续执行。 - **Semaphore**:信号量,控制多个线程对共享资源的访问。 ##### 3. 并发集合类使用 - **ConcurrentHashMap**:线程安全的哈希表,支持并发...

    CyclicBarrier的用法

    在Java多线程编程中,`CyclicBarrier`是一个非常重要的同步工具类,它允许一组线程等待其他线程到达某个屏障点后再一起继续执行。这个屏障点就是我们所说的“循环栅栏”,顾名思义,它就像一个旋转门,所有线程必须...

    Java 多线程与并发(10-26)-JUC锁- 锁核心类AQS详解.pdf

    Java中的多线程与并发编程是高级编程技术的重要组成部分,对于理解并实现高效的多任务处理至关重要。Java并发包(java.util.concurrent,简称JUC)提供了一系列工具和类库来帮助开发者简化并发编程的工作。其中,...

    java_util_concurrent_user_guide并发工具包详解

    Java并发工具包(java.util.concurrent)是Java编程中不可或缺的一部分,它为多线程环境提供了高效、安全且易用的工具。这个包包含了各种类和接口,帮助开发者编写高效的并发程序,避免了直接操作线程所带来的复杂性...

    JAVA多线程编程详解-详细操作例子

    Java并发包`java.util.concurrent`提供了如`Semaphore`(信号量)、`CountDownLatch`(计数器)、`CyclicBarrier`(回环栅栏)等工具,它们是设计来协助多线程间的协作和同步的。 理解并熟练运用这些知识点,可以...

    java+多线程+同步详解

    4. **java.util.concurrent** 包:提供了丰富的并发工具类,如`Semaphore`(信号量)、`CyclicBarrier`(回环栅栏)、`CountDownLatch`(计数器门闩)和`ReentrantLock`(可重入锁)。这些工具可以帮助开发者更精细...

    java多线程设计模式详解

    `java.util.concurrent`包提供了一系列并发工具类,如`Semaphore`(信号量)用于限制同时访问特定资源的线程数量,`CountDownLatch`(倒计时器)用于等待一组任务完成,`CyclicBarrier`(循环栅栏)让一组线程等待彼此到达...

    详解java多线程的同步控制

    同步控制是并发程序必不可少的重要手段,本文我们将通过重入锁、读写锁、信号量、倒计数器和循环栅栏以及他们的实例来介绍Java并发程序中的同步控制。 目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ...

    多线程编程.docx

    Java.util.concurrent包是专门为Java并发编程设计的,包含了许多高级并发组件。这些组件可以被分类为以下几大类: - **locks部分**:包括显式锁,如互斥锁和重入锁,它们提供了比synchronized更灵活的锁定机制。 - ...

    java多线程设计模式详解(PDF及源码)

    Java多线程设计模式是Java开发中不可或缺的一部分,它涉及到并发编程、系统性能优化以及程序的稳定性。在大型分布式系统和高性能应用中,理解和熟练掌握多线程设计模式至关重要。本资源提供了详细的Java多线程设计...

    JCToolsJDK中缺失的并发工具

    在Java开发中,JDK提供了一系列的并发工具类,如`java.util.concurrent`包中的`ExecutorService`、`Semaphore`、`BlockingQueue`等,它们极大地简化了多线程环境下的编程工作。然而,尽管JDK的标准库在并发处理方面...

    最新整理Java面试题

    - **并发工具**:Semaphore信号量、CountDownLatch计数器、CyclicBarrier栅栏、ExecutorService线程池。 - **并发容器**: ConcurrentHashMap、CopyOnWriteArrayList等并发安全的数据结构。 - **死锁、活锁与饥饿...

    java 并发包 pdf

    ### Java并发包详解:深入理解Java并发编程 #### 3.1 java.util.concurrent概述 `java.util.concurrent`包自JDK 5.0版本引入,是Java并发编程的核心,旨在利用现代多处理器和多核心系统的优势,提升大规模并发应用...

    谈谈java的concurrent用法

    在Java编程中,`java.util.concurrent`(简称`concurrent`)包是处理多线程并发问题的核心工具。这个包的引入极大地简化了并发编程,特别是从JDK1.5版本开始,由Doug Lea设计的一系列并发工具类使得编写高效、安全的...

Global site tag (gtag.js) - Google Analytics