`

CyclicBarrier使用方法(四)

阅读更多
package com.yonge.lock;

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

/**
 * 需求:模拟三个人一起去秋游的情景,首先三个人预定好在哪个景点集合,集合完后,又自由活动,又到另外一个景点集合,如此反复...
 * @author wb-gaoy
 * @version $Id: CyclicBarrierTest.java,v 0.1 2012-1-4 下午4:36:12 wb-gaoy Exp $
 */
public class CyclicBarrierTest {

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        final CyclicBarrier cb = new CyclicBarrier(3);
        for (int i = 0; i < 3; i++) {
            Runnable runnable = new Runnable() {
                public void run() {
                    try {
                        Thread.sleep((long) (Math.random() * 10000));
                        System.out.println("线程" + Thread.currentThread().getName()
                                           + "即将到达集合地点1,当前已有" + (cb.getNumberWaiting() + 1)
                                           + "个已经到达,"
                                           + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));
                        cb.await();

                        Thread.sleep((long) (Math.random() * 10000));
                        System.out.println("线程" + Thread.currentThread().getName()
                                           + "即将到达集合地点2,当前已有" + (cb.getNumberWaiting() + 1)
                                           + "个已经到达,"
                                           + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));
                        cb.await();
                        Thread.sleep((long) (Math.random() * 10000));
                        System.out.println("线程" + Thread.currentThread().getName()
                                           + "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1)
                                           + "个已经到达,"
                                           + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));
                        cb.await();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            service.execute(runnable);
        }
        service.shutdown();
    }
}

 

1
0
分享到:
评论

相关推荐

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    在上面的例子中,我们使用了一个CyclicBarrier来控制四个游戏玩家等待彼此达到某一目标后进行自己的下一步工作。当四个游戏玩家都调用了await(),CyclicBarrier的计数器变为0,四个游戏玩家继续自己下面的工作。 ...

    Java并发实例之CyclicBarrier的使用

    Java并发实例之CyclicBarrier的使用 CyclicBarrier是Java中的一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但是它的功能比CountDownLatch更加复杂且强大。CyclicBarrier...

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    在游戏场景中,如果四个玩家需要同时开始游戏,就可以使用CyclicBarrier。`CyclicBarrier(int parties, Runnable barrierAction)`构造函数接受两个参数,`parties`表示需要等待的线程数,`barrierAction`是所有线程...

    Java并发编程(CyclicBarrier)实例详解

    CyclicBarrier的使用方法是通过构造方法CyclicBarrier(int parties)来创建,parties表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。CyclicBarrier类还有一...

    让线程按顺序执行8种方法.doc

    四、使用线程的线程池方法 线程池是一种多线程编程技术,可以提高系统的性能和可扩展性。使用线程池可以让线程按顺序执行,且可以根据需要动态地添加或删除线程。 五、使用线程的Condition(条件变量)方法 ...

    Java多线程--等待所有子线程执行完的五种方法.docx

    ### 方法四:`CyclicBarrier` `CyclicBarrier`也是一种同步屏障,但它可以重置,允许在一组线程到达屏障点后重头开始。与`CountDownLatch`不同,`CyclicBarrier`通常用于一组线程相互依赖的情况,它们必须等待所有...

    Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解

    在Java多线程编程中,CyclicBarrier、Callable、Future和FutureTask是四个重要的组件,它们各自提供了不同的功能,帮助开发者更好地管理和协调并发任务。接下来,我们将深入探讨这些组件的特性和使用方法。 首先,...

    Thingking in java第四版课后习题答案

    通过解答这些题目,你可以更好地理解如何使用Java的synchronized关键字、wait()和notify()方法,以及ExecutorService和Future接口来管理线程。 此外,习题还可能涵盖异常处理、集合框架的并发操作、IO流的并发使用...

    ThinkInJava第四版代码

    12. **并发控制**:涵盖了线程间的协作,如信号量(Semaphore)、读写锁(ReentrantReadWriteLock)以及并发工具类(如CountDownLatch、CyclicBarrier、Semaphore等)的使用。 通过这个压缩包中的代码,读者可以...

    《软件开发基础(Java)》实验报告-Java多线程编程.docx

    4. 使用CyclicBarrier同步工具,确保所有子数组排序完成后才进行下一步操作。 5. 当所有线程到达CyclicBarrier时,调用await()方法,主线程等待所有子线程完成。 6. 最后,合并已排序的子数组,得到完整的排序结果。...

    Java线程面试题Top50[参照].pdf

    * CountdownLatch 不能重新使用,而 CyclicBarrier 可以重新使用 八、Java 内存模型是什么? * Java 内存模型规定和指引 Java 程序在不同的内存架构、CPU 和操作系统间有确定性地行为 * Java 内存模型对一个线程所...

    java核心技术第四版源代码.rar

    7. **泛型**:泛型用于提供类型安全的容器,源代码会展示如何使用泛型类、泛型方法和通配符。 8. **网络编程**:利用Socket和ServerSocket进行客户端和服务器端通信的示例。 9. **IO与NIO**:Java I/O和New I/O...

    CountDownLatch、Semaphore等4大并发工具类详解

    本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 Phaser,及其应用场景和使用方法。 CountDownLatch CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一...

    Android应用程序中多线程应用的方法研究.pdf

    开发者可以创建一个Handler对象,并重写handleMessage()方法,然后在其他线程中通过Looper.prepare()、Looper.loop()建立消息循环,使用sendMessage()或post()方法将消息放入消息队列,由主线程的Looper取出并分发给...

    2018年最全Java面试通关秘籍第四套

    - **设计模式应用**:Spring使用工厂、单例、代理等模式,MyBatis使用了模板方法和工厂模式。 6. **数据结构** - **树**:二叉查找树、平衡树(如AVL和红黑树)、B树和B+树用于高效检索。 - **图算法**:克鲁斯...

    Thinking in Java第四版(英文版+习题答案)

    8. **多线程**:Java的并发编程,包括Thread类的使用、同步机制(synchronized关键字和volatile属性)、线程池(ExecutorService)以及并发工具类(Semaphore、CyclicBarrier等)。 9. **输入/输出流**:I/O流的...

    java并发(二十四)多线程结果组装

    例如,可以使用`Callable`接口来定义一个返回结果的线程任务,然后用`ExecutorService`的`submit`方法提交任务并获取`Future`实例。一旦所有任务执行完毕,可以遍历`Future`列表,调用`get`方法获取每个任务的结果,...

Global site tag (gtag.js) - Google Analytics