java并发包中CountDownLatch和线程池的使用详解

Java并发包中的CountDownLatch和线程池是常用的并发编程工具,其使用详解如下:

CountDownLatch

介绍

CountDownLatch是一个计数器,用来控制一个或多个线程等待多个线程的执行完成。CountDownLatch的构造方法接收int类型的参数,该参数就是计数器的初始值。当一个线程完成自己的任务后,计数器的值就会减1,当计数器的值为0时,表示所有等待的线程都已经完成任务,可以继续执行后续的操作了。

使用场景

CountDownLatch适用于一些需要等待其它线程完成某些操作之后才能继续执行操作的场景,比如在主线程中等待所有子线程执行完成后执行某个操作。

示例1

下面是一个使用CountDownLatch的示例代码,其中有5个线程分别进行不同计算任务,主线程需要等待所有线程执行完成后,才能统计计算结果:

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        final int threadNum = 5;
        final CountDownLatch latch = new CountDownLatch(threadNum);
        for (int i = 0; i < threadNum; i++) {
            new Thread(() -> {
                // 模拟处理
                System.out.println(Thread.currentThread().getName() + " started");
                try {
                    Thread.sleep(2000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " ended");
                // 完成任务,计数器减1
                latch.countDown();
            }).start();
        }
        // 等待所有线程执行完成
        latch.await();
        System.out.println("All threads have completed");
    }
}

示例2

下面是另一个使用CountDownLatch的示例代码,其中主线程需要等待两个子线程执行完成后才能继续执行后面的操作:

public class CountDownLatchExample2 {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(2);
        new Thread(() -> {
            try {
                Thread.sleep(3000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread 1 executed");
            countDownLatch.countDown();
        }).start();
        new Thread(() -> {
            try {
                Thread.sleep(2000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread 2 executed");
            countDownLatch.countDown();
        }).start();
        countDownLatch.await();
        System.out.println("All threads have completed");
    }
}

线程池

介绍

线程池是一个可以重复利用线程的线程集合,可以避免线程的创建和销毁带来的开销。Java中的线程池是通过ThreadPoolExecutor实现的。

使用场景

线程池适用于需要频繁创建和销毁线程的场景,比如高并发的网络请求处理,多线程文件处理等。

示例1

下面是一个使用线程池的示例代码,其中我们通过ThreadPoolExecutor创建一个线程池,然后提交多个任务:

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(2);
        for (int i = 0; i < 5; i++) {
            int index = i + 1;
            threadPool.execute(() -> {
                System.out.println("Task " + index + " is being executed by " + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Task " + index + " has been completed.");
            });
        }
        threadPool.shutdown();
    }
}

示例2

下面是另一个使用线程池的示例代码,其中我们创建一个ScheduledThreadPoolExecutor来执行定时任务:

public class ScheduledThreadPoolExample {
    public static void main(String[] args) {
        ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2);
        threadPool.scheduleAtFixedRate(() -> {
            System.out.println("Task1 is being executed by " + Thread.currentThread().getName() + " at " + new Date());
        }, 0L, 2L, TimeUnit.SECONDS);
        threadPool.scheduleAtFixedRate(() -> {
            System.out.println("Task2 is being executed by " + Thread.currentThread().getName() + " at " + new Date());
        }, 0L, 4L, TimeUnit.SECONDS);
        // threadPool.shutdown();
    }
}

以上是CountDownLatch和线程池的详细使用攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java并发包中CountDownLatch和线程池的使用详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • .NET并发编程之函数闭包

    .NET并发编程是一个非常广泛的话题,其中函数闭包是一个非常重要的部分。在本篇攻略中,我将详细讲解什么是函数闭包,它的用途以及如何在.NET环境中使用它来实现并发编程。 什么是函数闭包 先从概念上来讲,函数闭包是一种特殊的函数,它可以访问其外部环境中的变量和函数,即使这些变量和函数已经不再存在,也可以继续使用。它通常用来创建函数工厂,或者是实现某些高级编程模…

    多线程 2023年5月17日
    00
  • Java多线程基础——Lock类

    Java多线程基础——Lock类 什么是Lock类 Lock类是Java多线程中用来控制并发访问的工具类。与Java的传统的synchronized关键字相比,Lock类具有更强的线程控制能力和更好的性能。 Lock类的使用方法 创建锁对象 在使用Lock对象之前,我们首先需要进行创建。Lock类中有两个最常用的子类:ReentrantLock和Reentr…

    多线程 2023年5月16日
    00
  • Linux系统下Shell多线程编程的实例

    我来为您详细讲解一下在Linux系统下Shell多线程编程的实例攻略。 Shell多线程编程的实例攻略 1. Shell脚本实现多线程 在linux系统下,我们可以通过工具和bash本身的内置命令实现多线程编程。其中常用的工具包括:GNU Parallel和xargs命令。 使用GNU Parallel实现多线程: cat filelist | parall…

    多线程 2023年5月17日
    00
  • JavaScript/TypeScript 实现并发请求控制的示例代码

    首先,实现并发请求控制的核心是利用 Promise 和 async/await 特性,统计当前请求并发数和控制请求的执行顺序。以下是一个 JavaScript 的示例代码: const MAX_REQUESTS = 5 // 设置最大并发请求数量 let currentRequest = 0 // 当前请求并发数计数器 // 请求响应函数,返回 Promis…

    多线程 2023年5月16日
    00
  • Java并发编程总结——慎用CAS详解

    Java并发编程总结——慎用CAS详解 什么是CAS? CAS是英文单词“Compare and Swap”的缩写,中文意思是比较并交换。是一种常见的并发编程技术,在Java并发编程中也得到了广泛的应用。 CAS技术主要通过保证内存操作的原子性以避免多线程之间的竞争和冲突。CAS操作的主要思路是先比较内存中的值是否与期望值相同,如果相同,则将新值写入内存;否…

    多线程 2023年5月17日
    00
  • 详解python多线程之间的同步(一)

    这里我将详细讲解“详解python多线程之间的同步(一)”的完整攻略。 标题:详解python多线程之间的同步(一) 前言 多线程是Python中一个非常重要的概念,它可以帮助我们更好的利用计算机的资源,提高程序的执行效率。但是多线程的并发操作会带来一些问题,比如线程之间的同步。本文就主要讲解Python多线程之间的同步问题。 同步的概念 在多线程中,当两个…

    多线程 2023年5月17日
    00
  • 反对使用Spring封装的多线程类原因

    请你注意阅读以下几个方面的攻略: 1. 为什么不建议使用Spring封装的多线程类 在Spring中封装了ThreadPoolTaskExecutor、Async和Schedulers等多线程实现类,使得我们可以很方便地进行线程操作。但是,使用Spring封装的多线程类存在以下问题: 代码的耦合性增加:线程池、线程数量等都是封装无法自定义配置,会使类与Spr…

    多线程 2023年5月16日
    00
  • 【java 多线程】守护线程与非守护线程的详解

    Java多线程:守护线程与非守护线程的详解 什么是守护线程? 在Java多线程中,守护线程是一种在后台运行的线程,它不会阻止程序的结束,也不会执行任何没有被其他非守护线程阻止的操作。 换句话说,当程序中最后一个非守护线程结束时,JVM会强制退出来,即使守护线程还在运行。 如何创建守护线程? 可以通过Thread类的setDaemon()方法来创建守护线程,示…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部