java 线程 新类库中的构件 CyclicBarrier使用

java 线程 新类库中的构件 CyclicBarrier使用

package org.rui.thread.newc; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * 赛马游戏 CyclicBarrier * * @author lenovo * */ class Horse implements Runnable { private static int counter = 0; private final int id = counter++; private int strides = 0; private static Random rand = new Random(47); private static CyclicBarrier barrier; public Horse(CyclicBarrier b) { barrier = b; } public synchronized int getStrides() { return strides; } @Override public void run() { try { while (!Thread.interrupted()) { synchronized (this) { //每场比赛都会加上随机 跨过的数字 0,1 or 2 strides += rand.nextInt(3);// produces 0,1 or 2 } // 等待所有的马都准备完毕,当所有的马向前移动时,cyclicBarrier将自动调用runnable栅栏动作任务,按顺序显示马和终点的位置 barrier.await(); } } catch (InterruptedException e) { } catch (BrokenBarrierException e) { throw new RuntimeException(e); } } public String toString() { return "Horse" + id + " "; } // 轨道 public String tracks() { StringBuilder s = new StringBuilder(); for (int i = 0; i horses = new ArrayList(); private ExecutorService exec = Executors.newCachedThreadPool(); private CyclicBarrier barrier; public HorseRace(int nHorses, final int pause) { barrier = new CyclicBarrier(nHorses/*等待的数量*/, new Runnable() { @Override public void run() { //打印信息 StringBuilder sb = new StringBuilder(); for (int i = 0; i = FINISH_LINE) {// System.out.println(horse + "赢得!"); exec.shutdownNow(); return; } } try { TimeUnit.MILLISECONDS.sleep(pause); } catch (InterruptedException e) { System.out.println("barrier-action sleep interrupted"); } } }); // 一旦所有的马都越过了栅栏,它就会自动地为下一回合比赛做好准备 for (int i = 0; i 0) {// optional argument int n = new Integer(arg[0]); nHorses = n > 0 ? n : nHorses; } if (arg.length > 1) {// optional argument int p = new Integer(arg[1]); pause = p > -1 ? p : pause; } // 竞赛 new HorseRace(nHorses, pause); } } /** =========================================================================== **0 **1 *2 **3 *4 **5 *6 =========================================================================== **0 ***1 *2 **3 *4 ***5 ***6 =========================================================================== ***0 ****1 ***2 ***3 **4 *****5 ****6 =========================================================================== *****0 ****1 *****2 ****3 **4 ******5 ****6 =========================================================================== ******0 ****1 ******2 *****3 ****4 ******5 *****6 =========================================================================== ******0 ******1 ******2 ******3 ****4 *******5 *****6 =========================================================================== *******0 ******1 *******2 ******3 *****4 ********5 *******6 =========================================================================== ********0 ******1 ********2 *******3 *******4 *********5 *********6 =========================================================================== ********0 ******1 *********2 *******3 *********4 *********5 *********6 =========================================================================== **********0 *******1 **********2 ********3 *********4 ***********5 *********6 =========================================================================== **********0 *******1 ************2 *********3 *********4 *************5 *********6 =========================================================================== ************0 *******1 *************2 ***********3 **********4 ***************5 ***********6 =========================================================================== ************0 ********1 *************2 *************3 ***********4 ***************5 *************6 =========================================================================== **************0 ********1 *************2 *************3 *************4 ... ...

...此处省略打印线 =========================================================================== **********************************************************************0 *******************************************************1 ******************************************************************2 ***********************************************************************3 ***********************************************************************4 ***********************************************************************5 *************************************************************6 =========================================================================== ***********************************************************************0 *******************************************************1 *******************************************************************2 *************************************************************************3 ***********************************************************************4 *************************************************************************5 ***************************************************************6 =========================================================================== ************************************************************************0 ********************************************************1 *******************************************************************2 ***************************************************************************3 ***********************************************************************4 ***************************************************************************5 ****************************************************************6 Horse3 赢得! */

java 线程 新类库中的构件 CyclicBarrier使用

一个容易理解的张孝祥老师讲解例子

package test; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * CyclicBarrier 应用 * @author lenovo * */ public class CyclicBarrierTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final CyclicBarrier cb = new CyclicBarrier(3); // 三个线程同时到达 for (int i = 0; i

点击复制链接 与好友分享!回本站首页
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力
上一篇:JAVA学习第四十六课 — 其他对象API(二)Date类 & Calendar类(重点掌握)
下一篇:链表逆转的多种实现
相关文章

Java多线程程序设计详细解析

实战体会Java的多线程编程

Java 程序中的多线程

Java多线程程序设计入门

多线程学习初步

JAVA 的多线程浅析

线程基础---wait(),notify的应用一例

用多线程又有几种常用的编程模型

用JAVA实现线程等待提示框

用Java实现多线程服务器程序

图文推荐
java 线程 新类库中的构件 CyclicBarrier使用
适配器模式
java 线程 新类库中的构件 CyclicBarrier使用
Handler的介绍和使用
java 线程 新类库中的构件 CyclicBarrier使用
struts2上传文件
java 线程 新类库中的构件 CyclicBarrier使用
通过JFreeChart的饼状

分类:默认分类 时间:2012-01-05 人气:13
本文关键词:
分享到:

相关文章

  • JAVA-多线程(高级) 2012-10-21

    阻塞队列: 1)BlockingQueue该接口提供了: add()/remove() 如果当队列没有数据,从队列中取数据;或者队列中数据已满, 向队列中添加数据;则会抛出异常. put()/take() 如果当队列没有数据,从队列中取数据;或者队列中数据已满, 向队列中添加数据;则会形成阻塞. offer()/poll() 会给调用者返回特殊的值,开发者可以通过这些值做相应的处理 同时还提供了超时版本. 2)接口实现 ArrayBlockingQueue>由数组实现的有界队列,默认情况下

  • java多线程(2):并发编程实践 2012-11-21

    第0章:简介 第1章:阻塞队列BlockingQueue 第0节:札记 * BlockingQueue是一种特殊的Queue,若BlockingQueue是空的, * 从BlockingQueue取东西的操作将会被阻断进入等待状态直到BlocingkQueue进了新货才会被唤醒。 * 同样,如果BlockingQueue是满的任何试图往里存东西的操作也会被阻断进入等待状态, * 直到BlockingQueue里有新的空间才会被唤醒继续操作。 * BlockingQueue提供的方法主要有: *

  • Java 并发编程(四)常用同步工具类 2013-04-11

    同步工具类可以使任何一种对象,只要该对象可以根据自身的状态来协调控制线程的控制流。阻塞队列可以作为同步工具类,其他类型的同步工具类还包括:信号量(Semaphore)、栅栏(Barrier)以及闭锁(Latch)。 闭锁 首先我们来介绍闭锁。 闭锁作用相当于一扇门:在闭锁到达某一状态之前,这扇门一直是关闭的,所有的线程都会在这扇门前等待(阻塞)。只有门打开后,所有的线程才会同时继续运行。 闭锁可以用来确保某些活动直到其它活动都完成后才继续执行,例如: 1、确保某个计算在其所有资源都被初始化之后才

  • Java 多线程 (并发)总结 2014-03-27

    一、概念 1. 维基百科解释 进程是什么? http://zh.wikipedia.org/wiki/%E8%BF%9B%E7%A8%8B 线程是什么? http://zh.wikipedia.org/wiki/%E5%9F%B7%E8%A1%8C%E7%B7%92 2. 一个巧妙的比喻 《进程与线程的一个简单解释》 简单摘要如下 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 计算机概念 类比 CPU 一座工厂

  • JAVA程序求职必看-125条常见的java面试笔试题汇总 2012-01-01

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,

  • 混血儿新生命--Java+PHP整合 2012-01-01

    最近才有时间处理此事,将此设想应用到现实应用程序中。 下面从两个方面讲解如何开发与发布。 示例:讲解java+php 开发模式,以菜单管理为例。 示例如下: 一:java 结构代码 java开发结构图如下: java 程序代码请看在下面上传文件,由于上传文件不能大于2M,所以用到的lib 没有上传,如需求,可留邮箱给我,我发给大家。 注:PHP和Java各有其语言内部定义的数据类型,当PHP数据传送到Java,或Java数据传送到PHP时,LAJP在内部自动地、准确地对他们进行转换,程序员无需进

  • java之jvm学习笔记(策略和保护域) 2012-01-02

    前面一节,我们做了一个简单的实验,来说明什么是策略文件,在文章的最后,也顺带的讲了一下什么是策略,还有策略的作用。 为了引出另外一个很重要的概念ProtectionDomain(保护域),所以我们还是要先来回顾一下什么是策略。 首先,什么是策略,今天的东西纯粹是比较概念的。当然,如果你读过笔记九,今天的东西,就真的是soso 策略与策略文件: java对应用程序的访问控制策略是由抽象类java.security.Policy的一个子类的单例所表示,任何时候,每个应用程序实际上只有一个Policy

  • Java 学习笔记:深入Serializable 2012-01-07

    Java的Serializable Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。 说白了,Java都是通过对象来描述实体,而对象是不能再网络上传递的,如果将对象生成一种可以解析的"一连串的字节描述"

  • java流--考验你的想象力 2012-01-07

    在学习java的学习中,我们会接触到一个概念,就是“流”,大概分为输入输出流,在我们的想象中,流,是水,是动态的,但是让我们在只有0和1的电脑上想象水流,这是个抽象的概念,今天,我们一起随着我的文字,梳理一下这些流! 首先,我们要知道电脑硬件的一点知识,我电脑上对数据的存储有三种方式,外界存储,内存,缓存。比如电脑上的硬盘,光盘,U盘等都是外存,咱们平常说的内存条就是内存,缓存是直接在CPU里的。我们就将这几个东西理解为容器,外存就像是门口的河,内存就是咱们家的水桶,缓存咱们自己的水杯,而水呢?

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.058 (s). 10 q(s)