JAVA concurrent包下Semaphore、CountDownLatch等用法
- CountDownLatch 跟join的区别
CountDownLatch用处跟join很像,但是CountDownLatch更加灵活,如果子线程有多个阶段a、b、c; 那么我们可以实现在a阶段完成后(在a阶段后 ,b、c阶段之前, latch.countDown();),就可以往下运行,主线程并不用等子线程把b、c阶段都跑完。
latch.countDown() 其实是state -1 操作,latch.await() 其实一直在判断state == 0 如果为0就不再等待向下执行,基于AQS实现。
以下代码展示的是跟join()用处相同。
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(2);
new Thread() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "sleep 3s");
Thread.sleep(3000);
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
new Thread() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "sleep 3s");
Thread.sleep(3000);
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
System.out.println(Thread.currentThread().getName() + "我是main线程");
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main线程结束了。。。");
}
}
- CountDownLatchTest result
main我是main线程
Thread-1sleep 3s
Thread-0sleep 3s
main线程结束了。。。
- 感觉Semaphore类,可以做限流,像令牌token一样
import java.util.concurrent.Semaphore;
public class SemaphoreTest {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(5);
for (int i = 0; i < 8; i++) {
new Work(i,semaphore).start();
}
}
static class Work extends Thread {
int num;
Semaphore sem;
public Work(int num, Semaphore sem) {
this.num = num;
this.sem = sem;
}
@Override
public void run() {
try {
sem.acquire();
System.out.println(Thread.currentThread().getName() +" worker.NO."+ String.valueOf(num)+" 占用了机器,开始生产。。。");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +" worker.NO."+ String.valueOf(num)+" 释放了机器。");
sem.release();
}
}
- Semaphore result
Thread-0 worker.NO.0 占用了机器,开始生产。。。
Thread-1 worker.NO.1 占用了机器,开始生产。。。
Thread-2 worker.NO.2 占用了机器,开始生产。。。
Thread-3 worker.NO.3 占用了机器,开始生产。。。
Thread-4 worker.NO.4 占用了机器,开始生产。。。
Thread-0 worker.NO.0 释放了机器。
Thread-5 worker.NO.5 占用了机器,开始生产。。。
Thread-1 worker.NO.1 释放了机器。
Thread-6 worker.NO.6 占用了机器,开始生产。。。
Thread-2 worker.NO.2 释放了机器。
Thread-7 worker.NO.7 占用了机器,开始生产。。。
Thread-3 worker.NO.3 释放了机器。
Thread-4 worker.NO.4 释放了机器。
Thread-5 worker.NO.5 释放了机器。
Thread-7 worker.NO.7 释放了机器。
Thread-6 worker.NO.6 释放了机器。
JAVA concurrent包下Semaphore、CountDownLatch等用法的更多相关文章
- Java并发机制(8)--concurrent包下辅助类的使用
Java并发编程:concurrent包下辅助类的使用 整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920397.html 1.CountDown ...
- Java:concurrent包下面的Map接口框架图(ConcurrentMap接口、ConcurrentHashMap实现类)
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- Java:concurrent包下面的Collection接口框架图( CopyOnWriteArraySet, CopyOnWriteArrayList,ConcurrentLinkedQueue,BlockingQueue)
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- java concurrent包的学习(转)
java concurrent包的学习(转) http://my.oschina.net/adwangxiao/blog/110188 我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常 ...
- List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedList Set有两个实现类:HashSet和LinkedHashSet AbstractSet实现了Set
List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedListSet有两个实现类:HashSet和LinkedHashSetAbstractS ...
- java.io 包下的类有哪些 + 面试题
java.io 包下的类有哪些 + 面试题 IO 介绍 IO 是 Input/Output 的缩写,它是基于流模型实现的,比如操作文件时使用输入流和输出流来写入和读取文件等. IO 分类 传统的 IO ...
- java.util.concurrent包下集合类的特点与适用场景
java.util.concurrent包,此包下的集合都不允许添加null元素 序号 接口 类 特性 适用场景 1 Queue.Collection ArrayBlockingQueue 有界.阻塞 ...
- 利用java concurrent 包实现日志写数据库的并发处理
一.概述 在很多系统中,往往需要将各种操作写入数据库(比如客户端发起的操作). 最简单的做法是,封装一个公共的写日志的api,各个操作中调用该api完成自己操作日志的入库.但因为入数据库效率比较低,如 ...
- java Concurrent包学习笔记(四):BlockingQueue
一.BlockingQueue概述 1.阻塞的含义 BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞.被阻塞的情况主要有如下两种: ,当一个线程对 ...
随机推荐
- c语言命名规范图
来自armbbs
- c:forTokens标签循环输出
对带有相同符合格式内容进行分割输出,例如,varstr="1,2,3,4,5,6"; c:forTokens属性说明表 引用 varStatus,它们描述了迭代的当前状态,如下这些 ...
- 【PE512】Sums of totients of powers(欧拉函数)
点此看题面 大致题意: 求\(\sum_{n=1}^{5*10^8}((\sum_{i=1}^n\phi(n^i))(mod\ n+1))\). 大力推式子 单独考虑\((\sum_{i=1}^n\p ...
- Linux性能优化实战学习笔记:第三十四讲
一.上节回顾 上一节,我带你学习了 Linux 网络的基础原理.简单回顾一下,Linux 网络根据 TCP/IP模型,构建其网络协议栈.TCP/IP 模型由应用层.传输层.网络层.网络接口层等四层组成 ...
- [LeetCode] 763. Partition Labels 分割标签
A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...
- 多线程下的HashMap竟然绕环了
导读:早就听说过HashMap不是线程安全的,在多线程情况下可能会出问题,自己一直是一知半解,正好五一有时间就抽时间来研究一下. 关键词:线程安全,HashMap 直接上图 总结 看过的知识点不一定属 ...
- HOT SUMMER 每天都是不一样,积极的去感受生活 C#关闭IE相应的窗口 .
window.close(); System.Diagnostics.Process[] myProcesses; myProcesses = System.Diagnostics ...
- Python文件读写机制
Python提供了必要的函数和方法进行默认情况下的文件基本操作 文件打开方式: open(name[,mode[buf]]) name:文件路径 mode:打开方式 buf:缓冲buffering大小 ...
- linux 修改oracle的字符集
select userenv('language') from dual; 命令可以查看服务端的使用的字符集. ssh登录,切换到oracle用户 切换用户命令:su -oracle 之后 ...
- html5手机端播放音效不卡的方法
html5手机端播放音效不卡的方法线下载http://wxserver.knowway.cn/solosea/js/audioEngine.js 这个是性能不错 然后直接播放音效就可以了 audioE ...