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

yizhihongxing

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日

相关文章

  • Python多线程与多进程相关知识总结

    Python多线程与多进程相关知识总结 多线程 多线程是指在同一进程中,多个线程并行执行不同的任务。Python提供了线程模块threading来处理多线程相关问题。线程模块允许开发商在单一进程内创建多个线程,从而最大限度地利用CPU资源。下面是一个简单的创建线程的示例代码: import threading def worker(num): "&…

    多线程 2023年5月17日
    00
  • golang实现并发数控制的方法

    GO实现并发数控制的方法 在进行并发编程时,控制并发数显得尤为重要。在GO语言中,我们可以通过各种方式实现该控制。本文将提供基于Goroutine和Channel两种实现方式的讲解。 Goroutine 实现 使用goroutine来实现并发数控制,最简单的方式是使用sync.WaitGroup和channel。 WaitGroup sync包提供了一个Wa…

    多线程 2023年5月16日
    00
  • Python多进程并发与多线程并发编程实例总结

    Python多进程并发与多线程并发编程是一个非常广泛且实用的话题。本文将为读者提供两个示例,展示如何在Python中使用多线程和多进程来实现并发编程,并给出一个完整的攻略。 一、多线程并发编程实例 多线程并发编程是指同时使用多个线程来共同完成一个任务。以下是一个简单的多线程并发编程实例: import threading def job(num): prin…

    多线程 2023年5月16日
    00
  • 一文带你了解Golang中的并发性

    一文带你了解Golang中的并发性 什么是Golang中的并发性 Golang作为一门现代化的编程语言,提供了同其他一些语言相似的多线程并发处理能力。Golang的并发机制使用一个叫做goroutine的轻量级协程来实现。Goroutine能够在一个Go程序中同时运行多个函数,而不用过多的耗费内存。 在Golang中,goroutine相对于其他线程的好处在…

    多线程 2023年5月17日
    00
  • Java多线程之并发编程的基石CAS机制详解

    Java多线程之并发编程的基石CAS机制详解 什么是CAS CAS,即Compare And Swap,中文翻译为比较并交换。是一种无锁算法,用于实现多线程同步。在CAS操作中包含三个操作数:内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CA…

    多线程 2023年5月16日
    00
  • java 并发线程个数的如何确定

    确定 Java 并发线程个数的过程是一个涉及多方面考虑的问题,需要综合考虑用户需求、硬件性能和线程模型等因素。下面是一些确定 Java 并发线程个数的方法: 方法一:根据硬件资源情况确定线程数 在确定 Java 并发线程个数时,首先需要考虑的是硬件资源的情况。例如,在多核 CPU 上,可以开启多个并发线程来充分利用 CPU 的处理能力。如果硬件资源不够充足,…

    多线程 2023年5月16日
    00
  • 浅谈Html5多线程开发之WebWorkers

    浅谈Html5多线程开发之WebWorkers 什么是WebWorkers WebWorkers是HTML5推出的一项新技术,用于JavaScript多线程开发。在WebWorkers API中,定义了两种类型的Worker:DedicatedWorker 和SharedWorker。其中,DedicatedWorker只能被一个页面使用,而SharedWo…

    多线程 2023年5月17日
    00
  • 分享J2EE的13种核心技术

    分享J2EE的13种核心技术攻略 1. 学习J2EE的目的 J2EE是Java 2企业版的缩写。它是一种Java开发平台,在开发大型企业应用时非常有用。J2EE平台提供了一个标准的框架,用于构建分布式和可扩展的企业应用程序。学习J2EE主要有以下目的: 理解J2EE平台的核心概念和架构 熟悉J2EE的编程模型和APIs 掌握J2EE开发的13种核心技术 2.…

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