下面对上面说的三个辅助类进行一个总结:

  1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:

    CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;

    而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;

    另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。

  2)Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限或者限流等等。

下面是几个小例子

public class CountDownLatchDemo {

    public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(2);
System.out.println("等爸爸妈妈都来了就吃饭");
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("爸爸过来了");
Thread.sleep(3000);
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
} }
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("妈妈过来了");
Thread.sleep(3000);
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
try {
latch.await();
System.out.println("开饭了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class CyclicbarrierDemo {
public static void main(String[] args) {
int no = 3;
final CyclicBarrier cyclicBarrier = new CyclicBarrier(no, new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"发令员:3---2---1,跑!");
}
});
for (int i = 0; i < no; i++) {
new Thread(new Sportsman(cyclicBarrier)).start();
} }
static class Sportsman implements Runnable{
CyclicBarrier cyclicBarrier; public Sportsman(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
try {
Thread.sleep((int)(Math.random()*1000));
System.out.println(Thread.currentThread().getName()+"准备好了,等待发令枪");
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"突突突");
}
}
}
public class SemaphoreDemo {
public static void main(String[] args) {
final Semaphore semaphore = new Semaphore(3);
new Thread(new Runnable() {
@Override
public void run() {
try {
semaphore.acquire(3);
System.out.println(Thread.currentThread().getName()+"获取3个许可证");
Thread.sleep(2000L);
}catch (Exception e){
e.printStackTrace();
}finally {
semaphore.release(3);
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
boolean flag = false;
try {
flag = semaphore.tryAcquire(1, 1, TimeUnit.SECONDS);
if(flag){
System.out.println(Thread.currentThread().getName()+"获取一个许可证");
}else {
System.out.println(Thread.currentThread().getName()+"获取失败!不能进入");
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(flag){
//可以释放其他线程的信号量,如果没有获取到,不要释放,不然会有问题
semaphore.release();
} }
}
}).start();
}
}

一、基础篇--1.3进程和线程-CountDownLatch、CyclicBarrier 和 Semaphore的更多相关文章

  1. Windows内核基础知识-8-监听进程、线程和模块

    Windows内核基础知识-8-监听进程.线程和模块 Windows内核有一种强大的机制,可以在重大事件发送时得到通知,比如这里的进程.线程和模块加载通知. 本次采用链表+自动快速互斥体来实现内核的主 ...

  2. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...

  3. Python开发【第九篇】:进程、线程

    什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于,程序是指令的集合,它是进程运行的静态描述文本 ...

  4. Java基础面试题(进程和线程的区别)

    进程和线程的区别 1.定义 进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更 ...

  5. python开发【第4篇】【进程、线程、协程】

    一.进程与线程概述: 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空 间. 线程,是进程的一部分,一个没有线程的进程可以被看作是单线程的.线程有时又被称为轻 ...

  6. java 多线程系列基础篇(十)之线程优先级和守护线程

    1. 线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5.“高优先级线程”会优先于“低优先级线程”执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon ...

  7. java 多线程系列基础篇(七)之线程休眠

    1. sleep()介绍 sleep() 定义在Thread.java中.sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”.sleep()会指定休眠时间,线 ...

  8. java 多线程系列基础篇(六)之线程让步

    1. yield()介绍 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权:但是,并不能保证在当前线程调用yield()之后,其 ...

  9. java 多线程系列基础篇(五)之线程等待与唤醒

    1.wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前线 ...

随机推荐

  1. golang 环境变量讲解

    以下配置以MAC 下配置为例,但其他环境下大同小异. GOROOT就是go的安装路径在~/.bash_profile中添加下面语句: GOROOT=/usr/local/go export GOROO ...

  2. Scrapy - 第一个爬虫和我的博客

    第一个爬虫 这里我用官方文档的第一个例子:爬取http://quotes.toscrape.com来作为我的首个scrapy爬虫,我没有找到scrapy 1.5的中文文档,后续内容有部分是我按照官方文 ...

  3. C++ void*解惑

    最近遇到void *的问题无法解决,发现再也无法逃避了(以前都是采取悄悄绕过原则),于是我决定直面它. 在哪遇到了? 线程创建函数pthread_create()的最后一个参数void *arg,嗯? ...

  4. Web开发的分层结构与MVC模式

    1.分层结构 所谓分层结构.把不同的功能代码封装成类,把相同功能的类封装在一个个的包中,也叫层.功能归类如下: 实体类: 封装数据,是数据的载体,在层与层之间进行传递,数据也就传递了.比如说要传递学生 ...

  5. 生产者消费者问题--BlockingQueue

    # 代码: public class App { public static void main(String[] args) { BlockingQueue<Integer> queue ...

  6. java8学习之Supplier与函数式接口总结

    Supplier接口: 继续学习一个新的函数式接口--Supplier,它的中文意思为供应商.提供者,下面看一下它的javadoc: 而具体的方法也是相当的简单,就是不接受任何参数,返回一个结果: 对 ...

  7. python+Appium自动化:输入中文问题

    只要接触到app自动化,难免会遇到许多坑,今天说说解决中文输入的问题. 流程: 进入到淘宝应用,点击搜索栏,输入文字 一开始send_keys(“中文”)时,搜索栏一直没有出现文字,脚本也没有提示报错 ...

  8. java程序连接Liunx服务器并且执行命令

    JSch 介绍 JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等.你可以将它的功能集成到你自己的 程序中.同时该项目也提供一个J2M ...

  9. 几台WEB经常宕机,求分析原因

    几台WEB服务器经常宕机,平时运行得好好的,负载也都在2以下,偶尔会突然负高上去就宕机,init 6也无法重启成功 只能echo 'b'>/proc/sysrq-trigger 硬重启才行,dm ...

  10. 运行一次node服务后,再次运行报错

    由于工作内容在git上,而系统又是window,大家知道,window自带的终端是不能进行git操作的,所以下载了一个git进行代码的更新提交. 我在git上运行了node服务后,由于不同的项目,我需 ...