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当线 ...
随机推荐
- CentOS7.2通过Yum安装MySQL5.7
1 下载源 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 2安装源 yum localinstall ...
- 前端与后端的数据交互(jquery ajax+python flask)
前端与后端的数据交互,最常用的就是GET.POST,比较常用的用法是:提交表单数据到后端,后端返回json 前端的数据发送与接收 1)提交表单数据 2)提交JSON数据 后端的数据接收与响应 1)接收 ...
- Kafka如何保证消息不丢失不重复
首先需要思考下边几个问题: 消息丢失是什么造成的,从生产端和消费端两个角度来考虑 消息重复是什么造成的,从生产端和消费端两个角度来考虑 如何保证消息有序 如果保证消息不重不漏,损失的是什么 大概总结下 ...
- jstl-----之<set>标签
<table id="attachtab" border="0" cellpadding="0" cellspacing=" ...
- javascript数据类型和常用内置对象(重要!)
数据类型:w3c undefind null string number boolean Array object 常用内置javascript对象: Array对象:Date对象:正则 ...
- Kotlin中三元运算符
int a = 10;int b = 11;int c = a > b ? a : b; 到了 kotlin中 val a = 10val b = 11val c = if (a > b) ...
- 线程池-Executors
合理使用线程池能够带来三个好处 减少创建和销毁线程上所花的时间以及系统资源的开销 提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行 提高线程的客观理性.线程是稀缺资源,如果无限制的创 ...
- python,类和对象练习
''' 按照一下要求定义一个游乐园门票类,并尝试计算2个成人+1个小孩子平日票价 1.平日票价100元 2.周末票价为平日票价120% 3.儿童半价 ''' class Ticket: pice = ...
- 使用PHP、MySQL实现修改密码 + 防止通过url强行进入系统
●使用PHP+MySQL实现修改密码 页面: index.php 登陆页面,输入默认密码登陆系统 check.php 核查页面,通过查询数据库检测密码是否正确 ——> 正确,则进入系统 ...
- RGB、YUV和HSV颜色空间模型
一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.但被描述的颜色对象本身是客观的,不同颜色空间只是从不同的角度去衡量同一个对象.颜色空间按照基本机 ...