秒杀多线程之CyclicBarrier
CyclicBarrier是用来一个关卡来阻挡住所有线程,等所有线程全部执行到关卡处时,再统一执行下一步操作。
package com.multithread.cyclicbarrier; import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import com.multithread.main.ExampleInterface; public class CyclicBarrierExample extends ExampleInterface { @Override
public void startDemo() {
System.out.println("开始线程:"+Thread.currentThread().getId());
// TODO Auto-generated method stub
final CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() { /*
* 运行在最后一个await到达的线程,不是主线程!
* */
@Override
public void run() {
System.out.println("所有选手ready"+"线程:"+Thread.currentThread().getId());
}
}); ExecutorService executor = Executors.newFixedThreadPool(3);
executor.submit(new Thread(new Runner(barrier, "1号选手")));
executor.submit(new Thread(new Runner(barrier, "2号选手")));
executor.submit(new Thread(new Runner(barrier, "3号选手"))); executor.shutdown();
} } package com.multithread.cyclicbarrier; import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; public class Runner implements Runnable { // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
private CyclicBarrier barrier; private String name; public Runner(CyclicBarrier barrier, String name) {
super();
this.barrier = barrier;
this.name = name;
} @Override
public void run() {
try {
Thread.sleep(1000 * (new Random()).nextInt(8));
System.out.println(name + " 准备好了..."+"线程:"+Thread.currentThread().getId());
// barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(name + " 起跑!"+"线程:"+Thread.currentThread().getId());
}
}
运行结果:
开始线程:1
3号选手 准备好了...线程:14
1号选手 准备好了...线程:10
2号选手 准备好了...线程:12
所有选手ready线程:12
2号选手 起跑!线程:12
3号选手 起跑!线程:14
1号选手 起跑!线程:10
CountDownLunch,SemaPhone,CyclicBarrier的异同。
CountDownLunch 可理解为减速器。首先设置一个值,每个线程countdown一下,知道最终为0.这个时候主线程中await函数会启动。
Semaphore 是一种资源,当开始设置一个资源总量,当需要时acquire,资源都在被使用的时候,线程会等待,知道有线程release资源。
CyclicBarrier是计数器,每个子线程await来阻塞线程,当子线程await的个数,达到设置的值时,每个线程都可以继续执行。
就像比赛选手等待。
秒杀多线程之CyclicBarrier的更多相关文章
- 戏说java多线程之CyclicBarrier(循环栅栏)的CyclicBarrier(int parties)构造方法
CyclicBarrier是JDK 1.5 concurrent包出现的一个用于解决多条线程阻塞,当达到一定条件时一起放行的一个类.我们先来看这样一个简单的需求. 现在我有一个写入数据的类,继承Run ...
- iOS多线程之8.NSOPeration的其他用法
本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...
- python 线程之 threading(四)
python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍 ...
- python 线程之 threading(三)
python 线程之 threading(一)http://www.cnblogs.com/someoneHan/p/6204640.html python 线程之 threading(二)http: ...
- python 线程之_thread
python 线程之_thread _thread module: 基本用法: def child(tid): print("hello from child",tid) _thr ...
- Java多线程之ConcurrentSkipListMap深入分析(转)
Java多线程之ConcurrentSkipListMap深入分析 一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...
- 【C#】线程之Parallel
在一些常见的编程情形中,使用任务也许能提升性能.为了简化变成,静态类System.Threading.Tasks.Parallel封装了这些常见的情形,它内部使用Task对象. Parallel.Fo ...
- iOS多线程之GCD小记
iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...
- 多线程之RunLoop
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
随机推荐
- cogs1713 [POJ2774]很长的信息
cogs1713 [POJ2774]很长的信息 原题链接 题解 把两串拼成A+'%'+B+'$'.跑后缀数组然后相邻两点i,i+1不在同一串里就用ht[i]更新答案. 好裸... Code // It ...
- JS Windows.document对象
四中选择器:class ,id , name , 标签 通过选择器获取对象: ...................................ClassName(''); -- class选择 ...
- 原生android(二)——认识activity
一.activity的生命周期 1.onCreate():在活动第一次被创建的时候调用,用来完成活动的初始化操作,如加载布局.绑定事件等 2.onStart():在活动由不可见变为可见时被调用 3.o ...
- python爬取淘宝华为手机
import re from selenium import webdriver from selenium.common.exceptions import TimeoutException fro ...
- Spring学习(3):Spring架构(转载)
1. Spring架构图 核心容器:包括Core.Beans.Context.EL模块. ●Core模块:封装了框架依赖的最底层部分,包括资源访问.类型转换及一些常用工具类. ●Beans模块:提供了 ...
- 导出Office365中的组及成员
Set-ExecutionPolicy unrestricted $cred = Get-Credential $session = New-PSSession -ConfigurationName ...
- XSS 注入检查点
如果你有个论坛,一般你会很注意用户发帖的注入问题,往往这个地方不会被注入,因为开发特别照顾.原则上XSS都是用户输入的,但是许多边角还是容易忽略.枚举一些检查点. 分页 分页通用组件获取url,修改p ...
- Spark SQL、DataFrame和Dataset——转载
转载自: Spark SQL.DataFrame和Datase
- AJAX学习2
作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正. 本文学习内容:https://www. ...
- java面向对象的冒泡排序,选择排序和插入排序的比较
这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换 0 ...