CyclicBarrier类合唱演绎
package a.jery; import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Jery { public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cb=new CyclicBarrier(5,new Runnable(){
@Override
public void run() {
System.out.println("人都到齐了,我们开始吧!");
try {
System.out.println("...singing...singing...");
Thread.sleep((long)(Math.random()*1000)+4000);//唱4秒到5秒
System.out.println("...singing...singing...");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("表演结束,大家回家吃饭吧!");
System.exit(0);
}
});
System.out.println(String.format("大家好,下面我们需要%s人合唱,有自愿者请上台", cb.getParties()));
for(int i=1;i<=5;i++){
service.execute(new Runnable(){
@Override
public void run() {
try {
Thread.sleep((long)(Math.random()*100));//为了看到效果,每个线程花费点时间
System.out.println(String.format("目前已有%s人上台", cb.getNumberWaiting()));
System.out.println(String.format("。呀,有人举手了,有请%s号上台", Thread.currentThread().getId()));
cb.await();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
} }
执行结果:
大家好,下面我们需要5人合唱,有自愿者请上台
目前已有0人上台
。呀,有人举手了,有请12号上台
目前已有1人上台
。呀,有人举手了,有请10号上台
目前已有2人上台
。呀,有人举手了,有请13号上台
目前已有3人上台
。呀,有人举手了,有请9号上台
目前已有4人上台
。呀,有人举手了,有请11号上台
人都到齐了,我们开始吧!
...singing...singing...
...singing...singing...
表演结束,大家回家吃饭吧!
这是一个最简单的演示,下面我们来看看循环屏障的真正好处:
package a.jery; import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Jery { public static void main(String[] args) {
final ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cb=new CyclicBarrier(5,new Runnable(){
@Override
public void run() {
System.out.println("人都到齐了,我们开始吧!");
try {
System.out.println("...singing...singing...");
Thread.sleep((long)(Math.random()*1000)+4000);//唱4秒到5秒
System.out.println("...singing...singing...");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("表演结束,大家回家吃饭吧!");
System.out.println("----------------");
System.out.println("大家吃好饭了吧,请唱歌的同学再次上台,我们要演奏下一首歌。");
}
});
System.out.println(String.format("大家好,下面我们需要%s人合唱,有自愿者请上台", cb.getParties()));
for(int i=1;i<=5;i++){
service.execute(new Runnable(){
@Override
public void run() {
try {
Thread.sleep((long)(Math.random()*100));//为了看到效果,每个线程花费点时间
System.out.println(String.format("目前已有%s人上台", cb.getNumberWaiting()));
System.out.println(String.format("。呀,有人举手了,有请%s号上台", Thread.currentThread().getId()));
cb.await();
//注意此处代码须在5人都上台并演唱结束后才能执行
Thread.sleep((long)(Math.random()*100));//为了看到效果,每个线程花费点时间
System.out.println(String.format("第二首歌已有%s人上台", cb.getNumberWaiting()));
System.out.println(String.format("有请%s号上台", Thread.currentThread().getId()));
cb.await();//此处又可以唱歌了,这就是循环屏障和CountDownLantch的最大区别。可以循环利用
System.out.println("我擦,怎么又要唱了,老子不干了");
Thread.currentThread().interrupt();
System.out.println("有你这么用人的吗?老子拆了你舞台.");
service.shutdown();
System.out.println("...bom...bom...");
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
} }
执行结果:
大家好,下面我们需要5人合唱,有自愿者请上台
目前已有0人上台
。呀,有人举手了,有请11号上台
目前已有1人上台
。呀,有人举手了,有请12号上台
目前已有2人上台
。呀,有人举手了,有请9号上台
目前已有3人上台
。呀,有人举手了,有请10号上台
目前已有4人上台
。呀,有人举手了,有请13号上台
人都到齐了,我们开始吧!
...singing...singing...
...singing...singing...
表演结束,大家回家吃饭吧!
----------------
大家吃好饭了吧,请唱歌的同学再次上台,我们要演奏下一首歌。
第二首歌已有0人上台
有请9号上台
第二首歌已有1人上台
有请12号上台
第二首歌已有2人上台
有请11号上台
第二首歌已有3人上台
有请13号上台
第二首歌已有4人上台
有请10号上台
人都到齐了,我们开始吧!
...singing...singing...
...singing...singing...
表演结束,大家回家吃饭吧!
----------------
大家吃好饭了吧,请唱歌的同学再次上台,我们要演奏下一首歌。
我擦,怎么又要唱了,老子不干了
我擦,怎么又要唱了,老子不干了
有你这么用人的吗?老子拆了你舞台.
我擦,怎么又要唱了,老子不干了
有你这么用人的吗?老子拆了你舞台.
有你这么用人的吗?老子拆了你舞台.
我擦,怎么又要唱了,老子不干了
有你这么用人的吗?老子拆了你舞台.
我擦,怎么又要唱了,老子不干了
有你这么用人的吗?老子拆了你舞台.
...bom...bom...
...bom...bom...
...bom...bom...
...bom...bom...
...bom...bom...
CyclicBarrier类合唱演绎的更多相关文章
- java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用
先来讲解一下Semaphore信号灯的作用: 可以维护当前访问自身的线程个数,并提供了同步机制, 使用semaphore可以控制同时访问资源的线程个数 例如,实现一个文件允许的并发访问数. 请看下面 ...
- JAVA CyclicBarrier类详解
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrie ...
- JUC——线程同步辅助工具类(Semaphore,CountDownLatch,CyclicBarrier)
锁的机制从整体的运行转态来讲核心就是:阻塞,解除阻塞,但是如果仅仅是这点功能,那么JUC并不能称为一个优秀的线程开发框架,然而是因为在juc里面提供了大量方便的同步工具辅助类. Semaphore信号 ...
- java并发编程工具类辅助类:CountDownLatch、CyclicBarrier和 Semaphore
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下 ...
- Java中的并发工具类:CountDownLatch、CyclicBarrier和Semaphore
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 一. ...
- Java多线程同步工具类之CyclicBarrier
一.CyclicBarrier使用 CyclicBarrier从字面上可以直接理解为线程运行的屏障,它可以让一组线程执行到一个共同的屏障点时被阻塞,直到最后一个线程执行到指定位置,你设置的执行线程就会 ...
- 【JUC】JDK1.8源码分析之CyclicBarrier(四)
一.前言 有了前面分析的基础,现在,接着分析CyclicBarrier源码,CyclicBarrier类在进行多线程编程时使用很多,比如,你希望创建一组任务,它们并行执行工作,然后在进行下一个步骤之前 ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- Java并发(8):CountDownLatch、CyclicBarrier、Semaphore、Callable、Future
CountDownLatch.CyclicBarrier.Semaphore.Callable.Future 都位于java.util.concurrent包下,其中CountDownLatch.C ...
随机推荐
- ExtJs4中的复选树级联选择
好久没有写新的博文了,过了个年休息了近一个月,人都懒散了.. 这几天要把项目中的几个模块有ext3升级到ext4,还要保持页面展示和功能要跟3.x版本的一样.升级并不是一件简单的是,基本相当于重写了, ...
- php字符串中单引号''和双引号“”的区别
(1)双引号可以解析字符串中的变量,单引号不能 $a = 10; $str = "this a var $a"; //输出this a var 10 (2)在双引号中可以使用转义字 ...
- JavaScript数组方法总结
由于最近都在freecodecamp上刷代码,运用了很多JavaScript数组的方法,因此做了一份关于JavaScript教程的整理,具体内容如下: 一.普通方法 1.join() 将数组元素连接在 ...
- C#面向对象的三大特性
下面是面向对象的本人解析的图片可以让你们更好的理解一下!!! 一,封装: 我们可以把世界上任何一个东西都看作为一个对象,那么我们这里以人为例,一个人就肯定是一个对象了.那么封装是什么呢?封装就是这个人 ...
- 【Python】实现5!+4!+3!+2!+1!
#!/usr/bin/env python #-*- coding:utf-8 -*- def factorial_add(n): empty_list=[] #定义一个空列表 for i in ma ...
- hibernate内部测试题(附赠答案)
一.选择题(共25题,每题2.5分,选择一项或多项,漏选错选不得分) 1.在Hibernate中,以下关于主键生成器说法错误的是( ). A.increment可以用于类型为long.short或by ...
- brute-force search
#include <pcl/search/brute_force.h> #include <pcl/common/common.h> #include <iostream ...
- Gym 100818G (模拟退火)
题目大意 给一张n个点的无向图,要求给每个点染色0或1,使得每个点的相邻相同颜色点的数量小于等于其度数的一半. 解题分析 没想到什么好的算法,就随机乱搞了. 若某个状态时,一个点的度数为cnt,相邻相 ...
- IOS网络开发(一)
1 简易的聊天工具 1.1 问题 Socket的英文原义是孔或者插座的意思,通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄,本案例使用第三方Socket编程框架AsyncSocket框架 ...
- LPTHW 笨方法学python 18章
看完18章以后,发现第一个练习中,使用了*args读取全部的的输入参数作为一个元组,但是在他的练习中只给了两个变量去赋值,当用户不清楚这个函数的定义时,就可能会给出过多的变量进这个函数,那么就会出现如 ...