【java笔记】java中的CountDownLatch线程同步工具

news/2024/9/28 13:15:09 标签: countDownLatch, 线程同步, 多线程, java

本文摘自简书用户“码农历险记”的文章。

CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。

1. CountDownLatch原理

CountDownLatch是通过一个计数器来实现的,计数器的初始化值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务。

2. 使用步骤

  • Main thread start
  • Create CountDownLatch for N threads
  • Create and start N threads
  • Main thead wait on latch
  • N threads completes there tasks are returns
  • Main thread resume execution

3. CountDownLatch的构造函数

//用等待的线程数量来进行初始化
public void CountDownLatch(int count){...}

计数器count是闭锁需要等待的线程数量,只能被设置一次,且CountDownLatch没有提供任何机制去重新设置计数器count。

与CountDownLatch的第一次交互是主线程等待其他线程。主线程必须在启动其他线程后立即调用CountDownLatch.await()方法。这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。

其他N个线程必须引用CountDownLatch闭锁对象,因为它们需要通知CountDownLatch对象,它们各自完成了任务;这种通知机制是通过CountDownLatch.countDown()方法来完成的;每调用一次,count的值就减1,因此当N个线程都调用这个方法,count的值就等于0,然后主线程就可以通过await()方法,恢复执行自己的任务。

4. 实例

MyRunable类:

java">package ecnu.cn;

import java.util.concurrent.CountDownLatch;

public class MyRunable implements Runnable {
    CountDownLatch latch;

    public MyRunable(CountDownLatch latch) {
        this.latch = latch;
    }

    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + "执行。");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            latch.countDown();
        }
    }
}

MyLatch类:

java">package ecnu.cn;

import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

public class MyLatch {

    public static void main(String[] args) throws InterruptedException {

        System.out.println("Main方法开始执行。");

        // 有3个线程
        int threadNum = 3;

        CountDownLatch latch = new CountDownLatch(threadNum);
        Executor executor = Executors.newFixedThreadPool(threadNum);

        List<MyRunable> myRunables = new ArrayList<MyRunable>();
        myRunables.add(new MyRunable(latch));
        myRunables.add(new MyRunable(latch));
        myRunables.add(new MyRunable(latch));

        for (MyRunable myRunable : myRunables) {
            executor.execute(myRunable);
        }

        latch.await();
        System.out.println("Main方法执行结束。");
    }
}

运行结果:

Main方法开始执行。
pool-1-thread-2执行。
pool-1-thread-3执行。
pool-1-thread-1执行。
Main方法执行结束。

http://www.niftyadmin.cn/n/968272.html

相关文章

wordpress批量翻译中文固定链接到英文

很多朋友采用文章标题作为固定链接&#xff0c;如果没有安装别名翻译插件&#xff0c;就会导致固定链接是中文的&#xff0c;很不美观。很多人是后来才知道安装插件的&#xff0c;那么以前的很多旧文章固定链接怎么办呢&#xff1f;接下来就为大家介绍一款支持批量翻译固定链接…

【java笔记】java中的线程池ThreadPoolExecutor的原理和使用

本文摘自简书作者“juconcurrent”的文章java线程池的使用。 线程池顾名思义就是存放线程的池子&#xff0c;本质是一种对象池&#xff0c;用来管理线程资源。线程池的使用避免了每次使用线程时重复的创建线程&#xff0c;而是从线程池中取出一个线程来执行任务&#xff0c;执行…

查看电脑端口占用情况

方法一&#xff1a;在运行中输入cmd&#xff0c;进入命令行&#xff0c;然后输入netstat -ano 就可以查看电脑各个端口的事情情况了&#xff0c;后面的pid是对应的进程的id&#xff0c;可以在Task Manager&#xff08;CtrlAtlDel呼唤出)点View->Select Columns找到&#xff…

【java笔记】java中线程池之ForkJoinPool的原理及使用

本文参考自CSDN作者 YourBatman 的ForkJoinPool线程池的使用以及原理和知乎作者 欣然 的文章高并发之Fork/Join框架使用及注意事项。 ForkJoinPool 主要用于实现“分而治之”的算法&#xff0c;特别是分治之后递归调用的函数&#xff0c;例如 quick sort 等。ForkJoinPool 最适…

通过SQL Server 2008 访问Oracle 10g

之前写过一篇关于SQL Server 访问MySQL 数据库的文章&#xff0c;最近正好又遇到需要访问Oracle 的情况&#xff0c;将配置过程记录下来也供大家参考。 准备工作 事先在需要访问Oracle 数据库的主机上完成以下工作&#xff1a; 1. 安装SQL Server 数据库&#xff1a;SQL Server…

【java笔记】java中ThreadLocal的原理和使用

本文参考了文章一针见血ThreadLocal和文章ThreadLocal作用、场景、原理。 1. 概念 ThreadLocal并不是一个Thread&#xff0c;而是Thread的局部变量&#xff0c;也许把它命名为ThreadLocalVariable更容易让人理解一些。 ThreadLocal是解决线程安全问题一个很好的思路&#xff0…

设置域用户帐户的登录时间

1.1.1 设置域用户帐户的登录时间 “登录时间”用来设置用户什么时间可以登录到域。默认是用户可以在任何时间登录到域。要指定登录时间段&#xff0c;双击用户帐户&#xff0c;在出现的用户属性对话框中&#xff0c;点击“帐户”标签&#xff0c;点击“登录时间”&#xff0c;可…

活动目录管理工具---使用保存的查询

1.1.1 使用保存的查询 保存的查询为管理员提供了一种快速、一致的方法&#xff0c;用来访问要对其执行特定任务或进行监视的一组公共目录对象。保存的查询使用预定义的 LDAP 字符串仅搜索指定的域分区&#xff0c;搜索的范围可具体到单个容器对象。还可以创建自定义的保存的查询…