java多线程快速入门(二十一)
CountDownLatch(闭锁)计数器
有一个任务A,它要等待其他4个任务执行完毕之后才执行,此时就可以利用CountDownLatch来实现这种功能
package com.cppdy;
import java.util.concurrent.CountDownLatch;
class MyThread17 extends Thread{
private CountDownLatch countdownlatch;
public MyThread17(CountDownLatch countdownlatch) {
this.countdownlatch=countdownlatch;
}
@Override
public void run() {
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName()+"线程执行完毕");
countdownlatch.countDown();
}
}
public class ThreadDemo17 {
public static void main(String[] args) throws Exception {
CountDownLatch cd=new CountDownLatch(2);
MyThread17 my1 = new MyThread17(cd);
MyThread17 my2 = new MyThread17(cd);
my1.start();
my2.start();
Thread.sleep(300);
cd.await();
System.out.println("主线程结束");
}
}
CyclicBarrier(回环栅栏)
CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数。当线程数达到这个数目时,所有进入等待状态的线程被唤醒并继续
package com.cppdy;
import java.util.concurrent.CyclicBarrier;
class MyThread18 extends Thread {
private CyclicBarrier cyclicBarrier;
public MyThread18(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
System.out.println("开始执行线程");
try {
sleep(2000);
//第一次进来,表示有一个线程等待,还不满足三个,不释放
//第二次进来,也不满足
//第三次进来,满足了,就继续执行下面的代码
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("结束执行线程");
}
}
public class ThreadDemo18 {
public static void main(String[] args) throws Exception {
CyclicBarrier cb = new CyclicBarrier(3);
MyThread18 my1 = new MyThread18(cb);
MyThread18 my2 = new MyThread18(cb);
MyThread18 my3 = new MyThread18(cb);
my1.start();
my2.start();
my3.start();
System.out.println("主线程执行结束");
}
}
Semaphore(信号量)
Semaphore是一种基于计数的信号量,它可以设置一个阀值,多个线程竞争获取许可信号,做自己的申请后归还,超过阀值后,线程申请许可信号将会被阻塞
package com.cppdy; import java.util.Random;
import java.util.concurrent.Semaphore; class MyThread19 extends Thread {
private String name;
private Semaphore sp; public MyThread19(String name, Semaphore sp) {
this.name = name;
this.sp = sp;
} @Override
public void run() {
int availablePermits = sp.availablePermits();
if (availablePermits > 0) {
System.out.println(name + ",好开心啊,居然还有坑");
} else {
System.out.println(name + ",好伤心啊,怎么没有坑了");
}
try {
sp.acquire();
System.out.println(name + ",好开心啊,终于抢到啦");
//模拟上厕所时间
Thread.sleep(new Random().nextInt(1000));
System.out.println(name + ",好爽啊,终于上完啦");
sp.release();
} catch (Exception e) {
e.printStackTrace();
}
}
} public class ThreadDemo19 { public static void main(String[] args) throws Exception {
Semaphore sp = new Semaphore(3);
for (int i = 0; i < 10; i++) {
MyThread19 mt = new MyThread19("第" + i + "个人", sp);
mt.start();
}
} }
java多线程快速入门(二十一)的更多相关文章
- java多线程快速入门(十一)
在方法上面加synchonizd用的是this锁 package com.cppdy; class MyThread7 implements Runnable { private Integer ti ...
- java 多线程 快速入门
------------恢复内容开始------------ java 多线程 快速入门 1. 进程和线程 什么是进程? 进程是正在运行的程序它是线程的集合 进程中一定有一个主线程 一个操作系统可以有 ...
- java多线程快速入门(二十二)
线程池的好处: 避免我们过多的去new线程,new是占资源的(GC主要堆内存) 提高效率 避免浪费资源 提高响应速度 作用:会把之前执行某个线程完毕的线程不会释放掉会留到线程池中给下一个调用的线程直接 ...
- java多线程快速入门(二十)
1.Java.util的线程安全工具类 Vector(线程安全) ArrayList(线程不安全) HashTable(线程安全) HashMap(线程不安全) 2.将线程不安全集合变为线程安全集合 ...
- java多线程快速入门(二)
通过继承Thread类来实行多线程 package com.cppdy; //通过继承Thread类来实行多线程 class MyThread extends Thread{ @Override pu ...
- java多线程快速入门(十二)
在静态方法上面加synchonizd用的是字节码文件锁 package com.cppdy; class MyThread8 implements Runnable { private static ...
- java多线程快速入门(六)
多线程应用实例(批量发送短信) 1.创建实体类 package com.cppdy; public class UserEntity { private int id; private String ...
- java多线程快速入门(一)
1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...
- java多线程快速入门(十八)
Lock锁是JDK1.5之后推出的并发包里面的关键字(注意捕获异常,释放锁) Lock与synchronized的区别 Lock锁可以人为的释放锁(相当于汽车中的手动挡) synchronized当线 ...
随机推荐
- luogu P3238 [HNOI2014]道路堵塞
传送门 这什么题啊,乱搞就算了,不知道SPFA已经死了吗 不对那个时候好像还没死 暴力就是删掉边后跑Dijkstra SPFA 然后稍微分析一下,可以发现题目中要求的不经过最短路某条边的路径,一定是先 ...
- javascript删除cookie
代码很简单 function deleteCookie (cookieName) { document.cookie = `${cookieName}=; expires=${new Date(0). ...
- Python转义字符&字符串运算符
Python转义字符 在需要在字符中使用特殊字符时,python用反斜杠(\)转义字符.如下表: 转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a ...
- redis架构~哨兵模式
一 哨兵模式稳定版本 redis哨兵模式是redis自带的高可用框架,稳定版本为redis2.8以上二 哨兵模式建立 1 避免单点故障,建立启动多个哨兵进程 2 哨兵模式启动命令 redis-s ...
- HTML - CSS 基础篇
网页主要由四部分组成: 1.内容(content) 图片.文本.多媒体等. 2.结构(structure) 框架布局(div+css布局的多行多列的结构.) 3.表现(presnetation) 修饰 ...
- scrapy基础 之 爬虫入门:先用urllib2来理解爬虫
1,概念理解 爬虫:抓取和保存网页信息,用户看到的网页实质是由 HTML 代码构成的,爬虫爬来的便是这些内容,通过分析和过滤这些 HTML 代码,实现对图片文字等资源的获取. URL:即统一资源定位符 ...
- 你必须知道的几种java容器(集合类)
一.基本概念 Java容器类类库的用途是“持有对象”,并将其划分为两个不同的概念: 1)Collection:一个独立元素的序列,这些元素都服从一条或者多条规则. List必须按照插入的顺序保存元素, ...
- 如何访问IPV6?很简单,几个命令行即可。
参考:清华大学ISATAP隧道配置方法 简单介绍一下windows下的配置方法,其他系统的配置方法详见上面提供的个链接. 首先打卡管理员权限的命令行窗口,依次输入如下命令即可 netsh int ip ...
- 匿名内部类可以访问的变量---静态成员变量和final修饰的局部变量
在学习多线程的时候用到了匿名内部类,匿名内部类可以访问static静态成员变量或者final修饰的局部变量. 匿名内部类在编译之后会生成class文件,比如Test内的第一个匿名内部类编译之后就是Te ...
- 【VMware vSphere】VMware vSphere简单了解
*什么是VMware vSphere 说VMware vSphere可能刚开始都是一脸懵逼,但是看到VMware时,首先想到的是不是VMware Workstation?也就是虚拟 ...