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多线程快速入门(二十一)的更多相关文章

  1. java多线程快速入门(十一)

    在方法上面加synchonizd用的是this锁 package com.cppdy; class MyThread7 implements Runnable { private Integer ti ...

  2. java 多线程 快速入门

    ------------恢复内容开始------------ java 多线程 快速入门 1. 进程和线程 什么是进程? 进程是正在运行的程序它是线程的集合 进程中一定有一个主线程 一个操作系统可以有 ...

  3. java多线程快速入门(二十二)

    线程池的好处: 避免我们过多的去new线程,new是占资源的(GC主要堆内存) 提高效率 避免浪费资源 提高响应速度 作用:会把之前执行某个线程完毕的线程不会释放掉会留到线程池中给下一个调用的线程直接 ...

  4. java多线程快速入门(二十)

    1.Java.util的线程安全工具类 Vector(线程安全) ArrayList(线程不安全) HashTable(线程安全) HashMap(线程不安全) 2.将线程不安全集合变为线程安全集合 ...

  5. java多线程快速入门(二)

    通过继承Thread类来实行多线程 package com.cppdy; //通过继承Thread类来实行多线程 class MyThread extends Thread{ @Override pu ...

  6. java多线程快速入门(十二)

    在静态方法上面加synchonizd用的是字节码文件锁 package com.cppdy; class MyThread8 implements Runnable { private static ...

  7. java多线程快速入门(六)

    多线程应用实例(批量发送短信) 1.创建实体类 package com.cppdy; public class UserEntity { private int id; private String ...

  8. java多线程快速入门(一)

    1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...

  9. java多线程快速入门(十八)

    Lock锁是JDK1.5之后推出的并发包里面的关键字(注意捕获异常,释放锁) Lock与synchronized的区别 Lock锁可以人为的释放锁(相当于汽车中的手动挡) synchronized当线 ...

随机推荐

  1. IT界的一些朗朗上口的名言

    序 中国有很多古代警世名言,朗朗上口,凝聚了很多故事与哲理.硅谷的互联网公司里头也有一些这样的名言,凝聚了很多公司价值观和做事的方法,对于很多程序员来说,其影响潜移默化.这里收集了一些,如下. Sta ...

  2. 【Vue】中 $attrs 中的使用方法

    vue官网是这样介绍的: 包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外).当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 ( ...

  3. Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields(翻译)

    0 - Abstract 我们提出了一种方法去在一张图片中有效地识别多个人体的2D姿势.这个方法使用了一个无参数表示法,我们将其叫为Part Affinity Fields(PAFs),其是去在图片中 ...

  4. 找出程序GasMileage中的哪一行与下列叙述相对应:

    找出程序GasMileage中的哪一行与下列叙述相对应: a.通知程序将使用Scanner类   import java.util.Scannner; b.创建一个Scanner类的对象   Scan ...

  5. 20165221学习基础和C语言基础调查

    1.你有什么技能比大多人(超过90%以上)更好? - 我觉得自己应该改算资质平平的那种人,如果说有什么技能比大多数人更好,我觉得应该是看过自己喜欢的书后,那种记忆能力.就比如自己从小对历史很感兴趣,小 ...

  6. tomcat quartz 被触发两次

    主要原因为tomcat server.xml 配置问题 <Host appBase="webapps" autoDeploy="true" name=&q ...

  7. Table Compression

    https://docs.oracle.com/cd/E11882_01/server.112/e40540/tablecls.htm#CNCPT608

  8. ipconfig命令查ip的时候给别人看有危险吗

    知识源:Unit 4: Networking 1 4.1 Networking 1 The Routing of a Packet  网址:https://www.baidu.com/link?url ...

  9. dubbo源码分析6——SPI机制中的AOP

    在 ExtensionLoader 类的loadFile方法中有下图的这段代码: 类如现在这个ExtensionLoader中的type 是Protocol.class,也就是SPI接口的实现类中Xx ...

  10. delphi 控件集

    delphi  控件集: 1)RAIZE 控件包  :http://www.raize.com/devtools/rzcomps/   被收购 Raize Components has been ac ...