Java并发编程:concurrent包下辅助类的使用

整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920397.html

1、CountDownLatch用法:

  count到达0之前,调用await()的线程会一直等待,count不能重用。

  1.1、构造与方法:

CountDownLatch(int count) 构造一个用给定计数初始化的 CountDownLatch

await() 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断(InterruptedException异常)。

countDown() 递减锁存器的计数,如果计数到达零,则释放所有等待的线程。 

  1.2、实例:

 1 public class Test {
2 public static void main(String[] args) {
3 final CountDownLatch latch = new CountDownLatch(2);
4
5 new Thread(){
6 public void run() {
7 try {
8 System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
9 Thread.sleep(3000);
10 System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
11 latch.countDown();
12 } catch (InterruptedException e) {
13 e.printStackTrace();
14 }
15 };
16 }.start();
17
18 new Thread(){
19 public void run() {
20 try {
21 System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
22 Thread.sleep(3000);
23 System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
24 latch.countDown();
25 } catch (InterruptedException e) {
26 e.printStackTrace();
27 }
28 };
29 }.start();
30
31 try {
32 System.out.println(Thread.currentThread().getName()+"等待2个子线程执行完毕...");
33 latch.await();
34 System.out.println("2个子线程已经执行完毕");
35 System.out.println("继续执行主线程");
36 } catch (InterruptedException e) {
37 e.printStackTrace();
38 }
39 }
40 }
子线程Thread-0正在执行
main等待2个子线程执行完毕...
子线程Thread-1正在执行
子线程Thread-0执行完毕
子线程Thread-1执行完毕
2个子线程已经执行完毕
继续执行主线程

result

2、CyclicBarrier用法:

  回环栅栏,作用同上,让一组线程等待某个状态(barrier状态)后再同时开始执行,CyclicBarrier可以被重用。

  2.1构造与方法:

CyclicBarrier(int parties) : 创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动
CyclicBarrier(int parties, Runnable barrierAction) :创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动barrierAction。
await(): 在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。(等待知道barrier上的线程数达到parties)

  2.2实例:

public class Test {
public static void main(String[] args) {
int N = 4;
CyclicBarrier barrier = new CyclicBarrier(N); for(int i=0;i<N;i++) {
new Writer(barrier).start();
} try {
Thread.sleep(25000);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("CyclicBarrier重用"); for(int i=0;i<N;i++) {
new Writer(barrier).start();
}
}
static class Writer extends Thread{
private CyclicBarrier cyclicBarrier;
public Writer(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
} @Override
public void run() {
System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据...");
try {
Thread.sleep(5000); //以睡眠来模拟写入数据操作
System.out.println("线程"+Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕"); cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
}catch(BrokenBarrierException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"所有线程写入完毕,继续处理其他任务...");
}
}
}
线程Thread-3正在写入数据...
线程Thread-0正在写入数据...
线程Thread-2正在写入数据...
线程Thread-1正在写入数据...
线程Thread-3写入数据完毕,等待其他线程写入完毕
线程Thread-0写入数据完毕,等待其他线程写入完毕
线程Thread-1写入数据完毕,等待其他线程写入完毕
线程Thread-2写入数据完毕,等待其他线程写入完毕
Thread-3所有线程写入完毕,继续处理其他任务...
Thread-0所有线程写入完毕,继续处理其他任务...
Thread-1所有线程写入完毕,继续处理其他任务...
Thread-2所有线程写入完毕,继续处理其他任务...
CyclicBarrier重用
线程Thread-4正在写入数据...
线程Thread-6正在写入数据...
线程Thread-5正在写入数据...
线程Thread-7正在写入数据...
线程Thread-7写入数据完毕,等待其他线程写入完毕
线程Thread-6写入数据完毕,等待其他线程写入完毕
线程Thread-4写入数据完毕,等待其他线程写入完毕
线程Thread-5写入数据完毕,等待其他线程写入完毕
Thread-5所有线程写入完毕,继续处理其他任务...
Thread-7所有线程写入完毕,继续处理其他任务...
Thread-6所有线程写入完毕,继续处理其他任务...
Thread-4所有线程写入完毕,继续处理其他任务...

result

3、Semaphore用法:信号量

  semaphore可以控制同时访问的线程个数,通过 acquire() 获取一个许可,release()释放一个许可;

  3.1、构造与方法  

Semaphore(int permits)创建具有给定的许可数和非公平的公平设置的 Semaphore。
Semaphore(int permits, boolean fair) 创建具有给定的许可数和给定的公平设置的 Semaphore。 //acquire为阻塞方法,一直等待信号量,直到获取到许可;
acquire((int permits)): 从此信号量获取一个(permits个)许可,在这之前,线程被阻塞;
release((int permits)) : 释放一个(permits个)许可,将其返回给信号量。
//tryAcquir能立即返回是否能获取许可
tryAcquire(int permits),(long timeout, TimeUnit unit)):尝试或一定时间内尝试获取许可,成功返回true,失败返回false。

  3.2、使用实例:

//假若一个工厂有5台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用
public class Test {
public static void main(String[] args) {
int N = 8; //工人数
Semaphore semaphore = new Semaphore(5); //机器数目
for(int i=0;i<N;i++)
new Worker(i,semaphore).start();
} static class Worker extends Thread{
private int num;
private Semaphore semaphore;
public Worker(int num,Semaphore semaphore){
this.num = num;
this.semaphore = semaphore;
} @Override
public void run() {
try {
semaphore.acquire();
System.out.println("工人"+this.num+"占用一个机器在生产...");
Thread.sleep(2000);
System.out.println("工人"+this.num+"释放出机器");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
工人1占用一个机器在生产...
工人2占用一个机器在生产...
工人0占用一个机器在生产...
工人4占用一个机器在生产...
工人3占用一个机器在生产...
工人1释放出机器
工人5占用一个机器在生产...
工人0释放出机器
工人6占用一个机器在生产...
工人2释放出机器
工人3释放出机器
工人4释放出机器
工人7占用一个机器在生产...
工人5释放出机器
工人6释放出机器
工人7释放出机器

result

Java并发机制(8)--concurrent包下辅助类的使用的更多相关文章

  1. Java 并发工具箱之concurrent包

    概述 java.util.concurrent 包是专为 Java并发编程而设计的包.包下的所有类可以分为如下几大类: locks部分:显式锁(互斥锁和速写锁)相关: atomic部分:原子变量类相关 ...

  2. Java:concurrent包下面的Map接口框架图(ConcurrentMap接口、ConcurrentHashMap实现类)

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  3. Java:concurrent包下面的Collection接口框架图( CopyOnWriteArraySet, CopyOnWriteArrayList,ConcurrentLinkedQueue,BlockingQueue)

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  4. Java并发编程:Concurrent锁机制解析

    Java并发编程:Concurrent锁机制解析 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: # ...

  5. Java 并发系列之二:java 并发机制的底层实现原理

    1. 处理器实现原子操作 2. volatile /** 补充: 主要作用:内存可见性,是变量在多个线程中可见,修饰变量,解决一写多读的问题. 轻量级的synchronized,不会造成阻塞.性能比s ...

  6. Java并发机制(9)--Callable、Future、FutureTask的使用

    Java并发编程:Callable.Future.FutureTask的使用 整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3949310.html ...

  7. 《Java并发编程的艺术》Java并发机制的底层实现原理(二)

    Java并发机制的底层实现原理 1.volatile volatile相当于轻量级的synchronized,在并发编程中保证数据的可见性,使用 valotile 修饰的变量,其内存模型会增加一个 L ...

  8. 【java并发编程艺术学习】(三)第二章 java并发机制的底层实现原理 学习记录(一) volatile

    章节介绍 这一章节主要学习java并发机制的底层实现原理.主要学习volatile.synchronized和原子操作的实现原理.Java中的大部分容器和框架都依赖于此. Java代码 ==经过编译= ...

  9. Java并发机制的底层实现原理之volatile应用,初学者误看!

    volatile的介绍: Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现 ...

随机推荐

  1. Django中ORM创建表关系

    一:django中ORM创建表关系 ORM创建外键关系 1.表与表之间的关系 1.表与表之间的关系 一对多 一对一 多对多 2.操作目标条件: 图书表 出版社表 作者表 作者详情表 3.外键关联 一对 ...

  2. Python_time库_特定字符串格式的时间、struct_time、时间戳的处理

    time库 时间戳:格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. # time.strptime(),功能:将特定字符串格 ...

  3. 攻防世界之Web_php_rce

    题目: ========================================================================== 解题思路: 1.这题主要考查ThinkPH ...

  4. python虚拟环境与伪静态网页

    目录 一:python虚拟环境 1.本地虚拟环境 1.创建虚拟环境 2.venv表示虚拟环境标志 3.虚拟环境下载django 4.使用虚拟环境 二:伪静态(了解) 1.什么是伪静态网页? 2.为什么 ...

  5. [编译器]dev c++单步调试

    一.dev c++调试崩溃的解决方案 1.点击"工具 -> 编译选项". 2.选择"编译器"选项卡,勾选"编译时加入以下命令",输入& ...

  6. 技术管理进阶——为什么Leader的话有时候你听不懂

    原创不易,求分享.求一键三连 Hi,各位亲爱的小伙伴,小钗公号遵循日复盘->周复盘->月复盘->季度复盘->年总结策略,所以某类型文章到后期才会成体系. 今天这篇文章属于「月复 ...

  7. syntax error: unexpected end of file完美解决方案

    用shell编写的一个脚本,执行的时候报错:syntax error: unexpected end of file! 发生这种报错有两种原因: 第一种: 如果你是用 windows 系统编写的脚本, ...

  8. idea教程--Maven 骨架介绍

    简单的说,Archetype是Maven工程的模板工具包.一个Archetype定义了要做的相同类型事情的初始样式或模型.这个名称给我们提供来了一个一致的生成Maven工程的方式.Archetype会 ...

  9. 哈工大 计算机网络 实验四 利用 Wireshark 进行协议分析

    计算机网络实验代码与文件可见github:计算机网络实验整理 实验名称 利用 Wireshark 进行协议分析 实验目的: 本次实验的主要目的. 熟悉并掌握Wireshark的基本操作,了解网络协议实 ...

  10. 无状态子域名爆破工具:ksubdomain

    概述 开源地址:https://github.com/knownsec/ksubdomain 二进制文件下载:https://github.com/knownsec/ksubdomain/releas ...