多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier

1、倒计时器CountDownLatch

CountDownLatch是一个多线程控制工具类。通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行

构造函数:

public CountDownLatch(int count) //count 计数个数

例如:在主线程中启动10个子线程去数据库中获取分页数据,需要等到所有线程数据都返回之后统一做统计处理

public class CountDownLatchDemo implements Runnable{

private static final CountDownLatch end = new CountDownLatch(10);

@Override

public void run() {

System.out.println("线程名称:" + Thread.currentThread().getName());

//数据业务处理

end.countDown();//计数减1

}

public static void main(String[] args) {
    CountDownLatchDemo countDownLatchDemo = new CountDownLatchDemo();
    System.out.println("计数开始");
    for (int i = 0; i < 10; i++) {
        new Thread(countDownLatchDemo).start();
    }
    try {
        end.await();
        System.out.println("计数结束");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

上述代码使用CountDownLatch的await()方法,要求主线程等待所有10个计数任务全部完成后,主线程才开始继续执行
可以通过getCount()方法获取当前的计数个数,当计数结束时count为0,且不会被重置

2、循环栅栏CyclicBarrier

CyclicBarrier也是一种多线程并发控制的工具。相比CountDownLatch,CyclicBarrier功能更加强大,主要表现在:

1)构造方法:

public CyclicBarrier(int parties, Runnable barrierAction)

CyclicBarrier的构造方法可以传入一个Runnable的barrierAction,可用于线程集结完毕后做一件特定的事情

2)CyclicBarrier可以重复使用,当一批线程凑满parties个是,计数器会归零,重新开始计数

public class CyclicBarrierDemo {

class Soldier implements Runnable{
    private CyclicBarrier cyclicBarrier;
    public Soldier(CyclicBarrier cyclicBarrier){
        this.cyclicBarrier = cyclicBarrier;
    }

    @Override
    public void run() {
        System.out.println("士兵 " + Thread.currentThread().getId() + " 报道");
        try {
            //等待所有士兵到齐
            cyclicBarrier.await();
            //执行任务
            doWork();
            cyclicBarrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }

    private void doWork() throws InterruptedException {
        Thread.sleep(1000);
        System.out.println("士兵" + Thread.currentThread().getId()+ " 任务完成");
    }
}

class Commond implements Runnable{
    @Override
    public void run() {
        System.out.println("任务结束");
    }
}

public static void main(String[] args) {
    CyclicBarrierDemo cyclicBarrierDemo = new CyclicBarrierDemo();
    CyclicBarrier cyclicBarrier = new CyclicBarrier(5, cyclicBarrierDemo.new Commond());
    for (int i = 0; i < 20; i++) {
        new Thread(cyclicBarrierDemo.new Soldier(cyclicBarrier)).start();
    }

}

}

执行结果:

可以看到,线程被分成了5个一组

时间: 2024-11-05 14:55:54

多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier的相关文章

并发工具类:倒计时器-CountDownLatch

title: 并发工具类:倒计时器-CountDownLatch author: Enjoyitlife.top date: 2019-10-01 10:51:33 summary: JUC包中的工具类CountDownLatch到底给我们提供了什么功能? categories: Concurrent tags: Concurrent-Tools 并发工具类:倒计时器-CountDownLatch CountDownLatch是JDK1.5提供一个并发编程辅助类,用于控制一个和多个线程进行等待,

24.循环栅栏 CyclicBarrier

import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; /** * 循环栅栏 CyclicBarrier * 可以反复使用的计数器 * 如:计数器设置为10,凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程 * * public CyclicBarrier(int parties, Runnab

多线程控制工具类--倒计时器CountDownLatch的使用(模仿火箭发射)

package com.thread.test.Lock; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CountDownLatchDemo implements Runnable { static final

循环栅栏:CyclicBarrier(司令要求任务) 读书笔记

可以理解为循环栅栏,栅栏就是一种障碍物.假如我们将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程,这就是循环栅栏的含义. 构造器: public CyclicBarrier(int parties, Runnable barrierAction) parties:计数总数,也就是参与的线程总数. barrierAction 当计数器一次完成计数后,系统会执行的动作 下面代码展示了 司令要求10个士兵去完成任务,先集合10个然后去一起完成任务,等全部完成

3.1.5 倒计时器:CountDownLatch

package 第三章.倒计时器CountDownLatch; import java.util.concurrent.CountDownLatch; /** * Created by zzq on 2018/1/24. */public class CountDoenLatchTest implements Runnable{static CountDownLatch countDownLatch=new CountDownLatch(3); public void run() { try {

3.1.6 循环栅栏:CyclicBarrier

package 第三章.循环栅栏CyclicBarrier; import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier; /** * Created by zzq on 2018/1/24. */public class CyclicBarrierTeST implements Runnable{ static CyclicBarrier cyclicBarrier=n

c# 自己制作一个简单的项目倒计时器

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace date { public partial class Form1 : Form { public Form1() { InitializeCompo

[转载]C# 多线程、控制线程数提高循环输出效率

C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段10条数据. int seed = Convert.ToInt32(createCount.Value) % 10 == 0 ? Convert.ToInt32(createCount.Value) / 10 : Convert.ToInt32(createCount.Value) / 10 + 1

【JavaScript】分秒倒计时器

一.基本目标 在JavaScript设计一个分秒倒计时器,一旦时间完毕使button变成不可点击状态 详细效果例如以下图.为了说明问题.调成每50毫秒也就是每0.05跳一次表, 真正使用的时候,把window.onload=function(){...}中的setInterval("clock.move()",50);从50调成1000就可以. 在时间用完之前,button还是能够点击的. 时间用完之后.button就不能点击了. 二.制作过程 <!DOCTYPE html PU