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();
        }
    }

}

原文地址:https://www.cnblogs.com/cppdy/p/10018107.html

时间: 2024-07-30 00:59:16

java多线程快速入门(二十一)的相关文章

java 多线程 快速入门

------------恢复内容开始------------ java 多线程 快速入门 1. 进程和线程 什么是进程? 进程是正在运行的程序它是线程的集合 进程中一定有一个主线程 一个操作系统可以有多个线程  什么是线程? 线程就是独立的运行一条执行路径 一个独立的执行单元 , 一个执行流程 为什么要使用多线程? 多线程提高程序效率 , 使用多线程 , 每个线程互补影响 2.创建线程的方式有哪些 1.使用继承 Thread类方式 如下示例 结果 1.继承 Thread 类 class Crea

AS3多线程快速入门(二):图像处理[译]

原文链接:http://esdot.ca/site/2012/intro-to-as3-workers-part-2-image-processing 在<AS3多线程快速入门>系列教程的第一部分中,我们研究了AS3 Worker的基本原理,包括多种通信方式,还展示了一个简单例子:Hello World Worker. 在这篇文章里,我将更进一步,向你展示如何利用多线程做些有用的功能,比如图像处理!在这次例子中,我将一边给一个大位图应用锐化滤镜,一边让主UI线程持续保持在30fps的渲染帧率.

java多线程快速入门(二)

通过继承Thread类来实行多线程 package com.cppdy; //通过继承Thread类来实行多线程 class MyThread extends Thread{ @Override public void run() { for (int i = 0; i < 30; i++) { System.out.println("线程打印:"+i); } } } public class ThreadDemo { public static void main(String

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

1.Java.util的线程安全工具类 Vector(线程安全) ArrayList(线程不安全) HashTable(线程安全) HashMap(线程不安全) 2.将线程不安全集合变为线程安全集合 package com.cppdy; import java.util.Collections; import java.util.HashMap; import java.util.Map; public class ThreadDemo16 { public static void main(S

java多线程快速入门(六)

多线程应用实例(批量发送短信) 1.创建实体类 package com.cppdy; public class UserEntity { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(Strin

java多线程快速入门(四)

通过匿名内部类的方法创建多线程 package com.cppdy; //通过匿名内部类的方法创建多线程 public class ThreadDemo2 { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 30; i++) { System.out.println("线程打印:"+i); }

java多线程快速入门(三)

//通过实现Runnable接口实现多线程 package com.cppdy; //通过实现Runnable接口实现多线程 class MyThread1 implements Runnable{ @Override public void run() { for (int i = 0; i < 30; i++) { System.out.println("线程打印:"+i); } } } public class ThreadDemo1 { public static voi

java多线程快速入门(十五)

使用violate关键字解决了变量的可见性问题(volatile让多线程刷新falg的值) package com.cppdy; class MyThread11 extends Thread { //volatile让多个线程刷新falg的值 public volatile boolean falg = true; @Override public void run() { System.out.println("子线程开始执行啦"); while (falg) { } System

java多线程快速入门(七)

什么是守护线程 守护线程是为用户线程服务的这么一个线程,主线程结束,守护线程也结束 package com.cppdy; class MyThread3 extends Thread{ @Override public void run() { System.out.println("开始执行线程"); try { sleep(1000); } catch (Exception e) { } System.out.println("结束执行线程"); } } pub