多线程(七、同步计数器-CountDownLatch)

CountDownLatch是一个线程的同步计数器,主要有2个使用场景。

1、作为一个开关,N个子线程准备就绪,等待主线程的放行,然后子线程一起开始执行。

Task

package com.jane;

import java.util.concurrent.CountDownLatch;

public class Task implements Runnable {
    private CountDownLatch countDownLatch;
    private String name;

    public Task(CountDownLatch countDownLatch, String name) {
        this.countDownLatch = countDownLatch;
        this.name = name;
    }

    @Override
    public void run() {
        try {
            System.out.println(name + "开始等待开关......");
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name + "执行任务完成");
    }
}

主线程

public class Main {

    public static void main(String[] args) throws InterruptedException {
        //主线程创建,和子线程共享
        CountDownLatch countDownLatch = new CountDownLatch(1);

        System.out.println("主线程启动......");

        //创建3个子线程
        Thread t1 = new Thread(new Task(countDownLatch, "线程-1"));
        Thread t2 = new Thread(new Task(countDownLatch, "线程-2"));
        Thread t3 = new Thread(new Task(countDownLatch, "线程-3"));

        t1.start();
        t2.start();
        t3.start();

        Thread.sleep(2000);
        System.out.println("主线程执行任务完毕,放行......");
        countDownLatch.countDown();
        System.out.println("主线程执行完毕");

    }
}

执行结果

2、主线程等待N个子线程的处理结果,子线程都完成后,主线程继续执行。

Task

package com.jane;

import java.util.concurrent.CountDownLatch;

public class Task1 implements Runnable {
    private CountDownLatch countDownLatch;
    private String name;

    public Task1(CountDownLatch countDownLatch, String name) {
        this.countDownLatch = countDownLatch;
        this.name = name;
    }

    @Override
    public void run() {
        try {
            System.out.println(name + "开始开始执行任务......");
            Thread.sleep(2000);
            System.out.println(name + "执行任务完成");
            countDownLatch.countDown();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

主线程

package com.jane;

import java.util.concurrent.CountDownLatch;

public class Main1 {

    public static void main(String[] args) throws InterruptedException {
        //主线程创建,和子线程共享
        CountDownLatch countDownLatch = new CountDownLatch(3);

        System.out.println("主线程启动......");

        //创建3个子线程
        Thread t1 = new Thread(new Task1(countDownLatch, "线程-1"));
        Thread t2 = new Thread(new Task1(countDownLatch, "线程-2"));
        Thread t3 = new Thread(new Task1(countDownLatch, "线程-3"));

        t1.start();
        t2.start();
        t3.start();

        System.out.println("主线程等待子线程执行结果......");
        countDownLatch.await();
        System.out.println("主线程执行完毕");

    }
}

执行结果

注意:CountDownLatch的计数只能使用一次,不会自动重新开始。

原文地址:https://blog.51cto.com/janephp/2404460

时间: 2024-10-10 06:23:07

多线程(七、同步计数器-CountDownLatch)的相关文章

多线程的同步工具(CountDownLatch)

public class CountDownLatchextends Object 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞.之后,会释放所有等待的线程,await 的所有后续调用都将立即返回.这种现象只出现一次--计数无法被重置.如果需要重置计数,请考虑使用 CyclicBarrier. 事例代码:

倒数计数器-CountDownLatch

最近写一个多线程程序,老是MAIN方法执行完了子线程还没执行完(不知道以前怎么玩儿的),得不到最终结果,于是找到了CountDownLatch CountDownLatch是一个同步辅助类,java.util.concurrent.CountDownLatch,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞.之后,会释放所有等

Java 并发同步器之CountDownLatch、CyclicBarrier

一.简介 1.CountDownLatch是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序的执行. CountDownLatch可以看作是一个倒计数的锁存器,当计数减至0时触发特定的事件.利用这种特性,可以让主线程等待子线程的结束. CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待

转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等.但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage). 一

(转载)Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等.但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage). 一个进程可以有很多线程,每条线程并行执行不同的任务. 线程可以提高应用程序在多核环境下处理诸

简单的多线程并发同步演示

#include "stdafx.h"#include <iostream>#include <Windows.h>using namespace std;HANDLE hMutex;DWORD WINAPI Fun(LPVOID lp){    while(1){        WaitForSingleObject(hMutex,INFINITE);        cout<<"fun"<<endl;//如果不用信

多线程之同步与死锁

面试的时候被问到,在线性回归中,有三个假设,是哪三个? 当时回答出来自变量x和因变量y之间是线性变化关系,也就是说,如果x进行线性变化的话,y也会有相应的线性变化. 提到数据样本的时候也答道了样本点之间要求是独立同分布的(根据MLE准则,假定对样本加上高斯白噪声e的情况下). 但是第三个最终还是没有答上来,面试官也没有再给提示,所以回来自己再查一下. LR的wiki页面(http://en.wikipedia.org/wiki/Linear_regression)中,有提到了LR的假设,分别是:

多线程以及同步问题

1.在单例设计模式中,会出现多线程的同步问题.主要表现在,当使用的是懒汉式单例设计模式来创建对象的时候,若有多个进程同时在执行,则有可能会创建了多个对象,但这个不是单例设计模式应该出现的问题.所以需要使用锁机制来解决.需要注意的是,饿汉式不会出现这个问题.具体代码如下. 1 class Singleton_lazy{ 2 //懒汉式 3 private Singleton_lazy(){} 4 5 private static Singleton_lazy INSTANCE = null; 6

Python标准库08 多线程与同步 (threading包)

Python主要通过标准库中的threading包来实现多线程.在当今网络时代,每个服务器都会接收到大量的请求.服务器可以利用多线程的方式来处理这些请求,以提高对网络端口的读写效率.Python是一种网络服务器的后台工作语言 (比如豆瓣网),所以多线程也就很自然被Python语言支持. (关于多线程的原理和C实现方法,请参考我之前写的Linux多线程与同步,要了解race condition, mutex和condition variable的概念) 多线程售票以及同步 我们使用Python来实