• 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等用法的更多相关文章

  1. Java并发机制(8)--concurrent包下辅助类的使用

    Java并发编程:concurrent包下辅助类的使用 整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920397.html 1.CountDown ...

  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包的学习(转) http://my.oschina.net/adwangxiao/blog/110188 我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常 ...

  5. List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedList Set有两个实现类:HashSet和LinkedHashSet AbstractSet实现了Set

    List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedListSet有两个实现类:HashSet和LinkedHashSetAbstractS ...

  6. java.io 包下的类有哪些 + 面试题

    java.io 包下的类有哪些 + 面试题 IO 介绍 IO 是 Input/Output 的缩写,它是基于流模型实现的,比如操作文件时使用输入流和输出流来写入和读取文件等. IO 分类 传统的 IO ...

  7. java.util.concurrent包下集合类的特点与适用场景

    java.util.concurrent包,此包下的集合都不允许添加null元素 序号 接口 类 特性 适用场景 1 Queue.Collection ArrayBlockingQueue 有界.阻塞 ...

  8. 利用java concurrent 包实现日志写数据库的并发处理

    一.概述 在很多系统中,往往需要将各种操作写入数据库(比如客户端发起的操作). 最简单的做法是,封装一个公共的写日志的api,各个操作中调用该api完成自己操作日志的入库.但因为入数据库效率比较低,如 ...

  9. java Concurrent包学习笔记(四):BlockingQueue

    一.BlockingQueue概述 1.阻塞的含义 BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞.被阻塞的情况主要有如下两种: ,当一个线程对 ...

随机推荐

  1. c语言命名规范图

    来自armbbs

  2. c:forTokens标签循环输出

    对带有相同符合格式内容进行分割输出,例如,varstr="1,2,3,4,5,6"; c:forTokens属性说明表 引用 varStatus,它们描述了迭代的当前状态,如下这些 ...

  3. 【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 ...

  4. Linux性能优化实战学习笔记:第三十四讲

    一.上节回顾 上一节,我带你学习了 Linux 网络的基础原理.简单回顾一下,Linux 网络根据 TCP/IP模型,构建其网络协议栈.TCP/IP 模型由应用层.传输层.网络层.网络接口层等四层组成 ...

  5. [LeetCode] 763. Partition Labels 分割标签

    A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...

  6. 多线程下的HashMap竟然绕环了

    导读:早就听说过HashMap不是线程安全的,在多线程情况下可能会出问题,自己一直是一知半解,正好五一有时间就抽时间来研究一下. 关键词:线程安全,HashMap 直接上图 总结 看过的知识点不一定属 ...

  7. HOT SUMMER 每天都是不一样,积极的去感受生活 C#关闭IE相应的窗口 .

    window.close(); System.Diagnostics.Process[]   myProcesses;     myProcesses   =   System.Diagnostics ...

  8. Python文件读写机制

    Python提供了必要的函数和方法进行默认情况下的文件基本操作 文件打开方式: open(name[,mode[buf]]) name:文件路径 mode:打开方式 buf:缓冲buffering大小 ...

  9. linux 修改oracle的字符集

    select   userenv('language')   from   dual; 命令可以查看服务端的使用的字符集. ssh登录,切换到oracle用户 切换用户命令:su -oracle 之后 ...

  10. html5手机端播放音效不卡的方法

    html5手机端播放音效不卡的方法线下载http://wxserver.knowway.cn/solosea/js/audioEngine.js 这个是性能不错 然后直接播放音效就可以了 audioE ...