• 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 释放了机器。

最新文章

  1. YII2.0 Activeform表单组件的使用方法
  2. 话说C++中的左值、纯右值、将亡值
  3. Python range() xrange()
  4. “破解大牛是怎么炼成的”之壳与ESP定律
  5. Android问题-XE5提示&quot;[DCC Fatal Error] Project1.dpr(1): F1027 Unit not found: &#39;System.pas&#39; or binary equivalents (.dcu/.o)&quot;
  6. Colletion View 简单的备忘
  7. PHP 数组转JSON数据(convert array to JSON object);
  8. ASP.NET动态引用WebService接口
  9. 关于程序猿怎样降低程序Bug的若干建议
  10. web实现数据交互的几种常见方式
  11. 浅谈ASP.NET框架
  12. 为什么java的类是单继承的,接口是多继承的
  13. RuntimeError: Python is not installed as a framework.
  14. Vue-初步了解vue-router的三要素:路由map 、路由视图、路由导航
  15. rabbitMQ rabbitmq-server -detached rabbitmq-server -detached rabbitmq-server -detached
  16. uva-208-枚举-并查集
  17. doc2vec使用笔记
  18. Django进阶 (二)
  19. 分布式监控系统开发【day37】:监控数据如何存储(七)
  20. 禁止别人用QQ号搜索到你,同时告诉你如何破解

热门文章

  1. 残差residual VS 误差 error
  2. 基于Distiller的模型压缩工具简介
  3. [LeetCode] 419. Battleships in a Board 平板上的战船
  4. C# HTTP系列6 HttpWebResponse.StatusCode 响应代码中文详解
  5. 使用maven-resources-plugin插件分环境配置
  6. Feign的介绍和使用
  7. sublime text3安装ConvertToUTF8
  8. pkg_resources.DistributionNotFound: The &#39;pip==7.1.0&#39; distribution was not found and is required by the application
  9. C#中$拼字符串
  10. Android Studio Analyze APK 一直显示 Parsing Manifest探因及解决