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当线 ...
随机推荐
- 第27月第25天 clang -rewrite-objc main.m
1.clang -rewrite-objc main.m #import <objc/runtime.h> #import<objc/message.h> #import &l ...
- python写商品管理练习
#.添加 #.商品名称 #.要从文件里面把所有的商品读出来 #.价格 #.写一个方法判断是否为合理的价格 #.数量 #整数 # product = { # "爱疯差":{ # &q ...
- Python文件读写之r+/w+/a+
读模式 r 打开不存在的文件会报错.不能写:如不指定模式则默认是r 写模式 w 打开不存在的文件会,会新建一个文件:打开存在的文件会先清空后覆盖原有文件:不能读 追加模式 a 打开不存在的文件会,会新 ...
- Java基础03-12_对象比较
对象比较 如果说现在有两个数字要判断是否相等,可以使用"=="完成 如果是字符串要判断是否相等使用"equals()" 但是如果说现在有一个自定义的类,要想判断 ...
- 使用WebView时软键盘遮挡H5页面解决办法
简单解决办法:在清单文件中添加 android:windowSoftInputMode="adjustResize" 此举可在软键盘弹出时,重新测量布局,保证不遮挡光标的所在位置. ...
- Print Article(斜率DP入门+单调队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题目大意:给你n个数,然后问你怎么分割当前的这n个数位那几组,使得每一组的权值加起来最大.每一组 ...
- AOP 横行切面编程和 纵向编程 介绍
1 aop:面向切面(方面)编程,扩展功能不修改源代码实现 2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码3 aop底层使用动态代理实现(1)第一种情况,有接口情况,使用动态代理创建接口 ...
- AIDL通信过程中设置死亡代理
关于AIDL的使用参考学习: https://blog.csdn.net/u011240877/article/details/72765136 https://blog.csdn.net/iromk ...
- Javascript - ExtJs - Window组件
1.所有组件都可以放入window,此时子组件不需要配置renderTo,只需要将它们作为window的items子项即可. 2.items子项必须先创建,最后创建window,否则子项不会显示. 3 ...
- spring-session+Redis实现Session共享
关于session共享的方式有多种: (1)通过nginx的ip_hash,根据ip将请求分配到对应的服务器 (2)基于关系型数据库存储 (3)基于cookie存储 (4)服务器内置的session复 ...