让我给您详细讲解一下关于Java多线程中CountDownLatch与线程池ThreadPoolExecutor/ExecutorService的用法及案例的完整攻略。这里会分为以下几个部分:
- 什么是CountDownLatch以及用途
- CountDownLatch的用法示例
- 什么是线程池ThreadPoolExecutor/ExecutorService以及用途
- 线程池ThreadPoolExecutor/ExecutorService的用法示例
- 包含CountDownLatch和线程池ThreadPoolExecutor/ExecutorService的案例
接下来,让我分别详细讲解各个部分的内容。
1. 什么是CountDownLatch以及用途
CountDownLatch是Java多线程中一个非常实用的工具类,它的主要作用是,允许一个或多个线程等待其他线程的一系列操作完成。在某些场景下,我们可能需要在一个线程等待其他线程完成某个操作后再进行下一步的操作,这时候就可以使用CountDownLatch。
CountDownLatch使用起来比较简单,它主要包含以下两个方法:
- countDown():每次调用减1,当减到0时,被等待的线程就会被唤醒
- await():等待其他线程完成操作,当countDown()调用次数达到count时,await()方法会被唤醒
2. CountDownLatch的用法示例
下面是一个简单的CountDownLatch示例,代码如下:
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
int count = 5;
CountDownLatch latch = new CountDownLatch(count);
for (int i = 0; i < count; i++) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行完成");
latch.countDown();
}
}).start();
}
System.out.println("等待子线程执行完成...");
latch.await();
System.out.println("所有子线程执行完成");
}
}
通过以上代码,我们可以创建一个CountDownLatch对象,并传入一个整数count。在主线程中创建5个子线程去执行任务,每个子线程执行完成后,使用countDown()方法减1。当5个子线程都执行完成后,await()方法就会被解除阻塞。
3. 什么是线程池ThreadPoolExecutor/ExecutorService以及用途
线程池ThreadPoolExecutor/ExecutorService是Java中一个非常实用的工具类,它的主要作用是,通过维护一个线程池来管理线程,从而避免了频繁地创建和销毁线程的开销。
线程池ThreadPoolExecutor/ExecutorService主要包含以下几个方法:
- execute():提交一个任务,由线程池进行调度执行
- submit():提交一个任务,并返回一个Future对象,可以用来判断任务是否完成以及获取任务执行结果
- shutdown():关闭线程池
- shutdownNow():关闭线程池并停止所有正在执行中的任务
4. 线程池ThreadPoolExecutor/ExecutorService的用法示例
下面是一个简单的线程池ThreadPoolExecutor示例,代码如下:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行任务");
}
});
}
executorService.shutdown();
}
}
通过以上代码,我们可以使用Executors创建一个固定线程数量的线程池,然后提交10个任务给线程池去执行。每个任务完成后,使用shutdown()方法关闭线程池。
5. 包含CountDownLatch和线程池ThreadPoolExecutor/ExecutorService的案例
下面是一个包含CountDownLatch和线程池ThreadPoolExecutor/ExecutorService的案例,代码如下:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Demo {
public static void main(String[] args) throws InterruptedException {
int taskCount = 10;
CountDownLatch countDownLatch = new CountDownLatch(taskCount);
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < taskCount; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行任务");
countDownLatch.countDown();
}
});
}
countDownLatch.await();
executorService.shutdown();
System.out.println("所有任务执行完成");
}
}
通过以上代码,我们可以创建一个CountDownLatch对象,并设置计数器为10。然后创建一个线程池,提交10个任务去执行。每个任务执行完成后,使用countDown()方法减少计数器。当10个任务都执行完成后,await()方法就会解除阻塞,线程池使用shutdown()方法关闭。最后输出“所有任务执行完成”。
以上就是关于Java多线程中CountDownLatch与线程池ThreadPoolExecutor/ExecutorService的用法及案例的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例 - Python技术站