您的位置:首页 > 游戏 > 手游 > 九九建筑网_公司logo设计理念_网站推广优化的公司_百度客服人工电话

九九建筑网_公司logo设计理念_网站推广优化的公司_百度客服人工电话

2025/4/21 19:29:16 来源:https://blog.csdn.net/qq_40121580/article/details/146174746  浏览:    关键词:九九建筑网_公司logo设计理念_网站推广优化的公司_百度客服人工电话
九九建筑网_公司logo设计理念_网站推广优化的公司_百度客服人工电话

在Java中,确保线程池中的所有任务都执行完毕之后再继续下一步操作是一个常见的需求。实现同步线程池的方式通常涉及到使用Java的ExecutorService接口以及其实现类,如ThreadPoolExecutor。同步线程池的概念可能指的是确保所有提交给线程池的任务在继续执行后续代码之前已经完成。以下是几种常见的方法来实现这一点:

使用 ThreadPoolExecutorawaitTermination 方法

当你希望等待所有已经提交的任务完成(包括那些可能还在队列中等待执行的任务),你可以调用 shutdown() 方法来阻止新的任务被提交,并使用 awaitTermination(long timeout, TimeUnit unit) 来等待所有任务完成。这里提供了一个示例:

import java.util.concurrent.*;public class ThreadPoolCompleted {public static void main(String[] args) throws InterruptedException {ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 20,0L, TimeUnit.MILLISECONDS,new LinkedBlockingDeque<>(1024));addTask(threadPool);// 关闭线程池,不再接受新任务threadPool.shutdown();// 等待所有任务完成或超时if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) {System.out.println("线程池没有在规定时间内完成任务");} else {System.out.println("所有任务已完成");}}private static void addTask(ThreadPoolExecutor threadPool) {for (int i = 0; i < 5; i++) {final int taskId = i;threadPool.submit(() -> {try {Thread.sleep(new Random().nextInt(5) * 1000);System.out.println("任务" + taskId + "执行完成");} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}}
}

使用 shutdown()awaitTermination()

这是最常用的方法之一,它通过调用线程池的shutdown()方法来防止新的任务被提交,并且使用awaitTermination(long timeout, TimeUnit unit)等待所有已提交的任务完成。

ExecutorService executor = Executors.newFixedThreadPool(4);
// 提交你的任务...
executor.shutdown();
try {if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {System.out.println("线程池没有在规定时间内完成任务");}
} catch (InterruptedException e) {// 处理中断异常
}

使用 invokeAll()

如果你有一组Callable任务需要并行执行,并且希望阻塞直到所有这些任务都完成,可以使用invokeAll()方法。这个方法接受一个Callable列表,并返回一个Future列表,每个Future代表对应的Callable的结果。

ExecutorService executor = Executors.newFixedThreadPool(4);
List<Callable<String>> tasks = new ArrayList<>();
// 添加你的任务到tasks列表中...
try {List<Future<String>> futures = executor.invokeAll(tasks);for (Future<String> future : futures) {// 这里你可以获取每个任务的结果String result = future.get(); // 此处会阻塞直到对应的任务完成}
} catch (InterruptedException | ExecutionException e) {// 异常处理
}

使用 CountDownLatch

另一种方式是利用CountDownLatch,它可以用来让主线程等待一组工作线程完成它们的工作。你可以在每个工作线程开始时增加计数器,在工作完成后减少计数器。主线程则调用latch.await()来等待计数器归零。

CountDownLatch latch = new CountDownLatch(numberOfTasks);
ExecutorService executor = Executors.newFixedThreadPool(4);for (int i = 0; i < numberOfTasks; i++) {final int taskId = i;executor.submit(() -> {try {// 执行任务} finally {latch.countDown(); // 当任务完成时减少计数器}});
}latch.await(); // 主线程在这里等待,直到计数器变为零

使用 CompletableFuture.allOf()

对于异步编程模型,如果使用的是Java 8或更高版本,可以使用CompletableFuture结合allOf()方法来等待多个异步任务完成。

CompletableFuture<?>[] futures = new CompletableFuture<?>[numberOfTasks];
for (int i = 0; i < numberOfTasks; i++) {futures[i] = CompletableFuture.runAsync(() -> {// 执行任务}, executor);
}CompletableFuture.allOf(futures).join(); // 等待所有future完成

如果需要处理大量并发任务并且希望对它们进行细粒度控制,那么 CountDownLatch 可能是个不错的选择;而如果你正在开发现代Java应用并利用了流式API和异步编程模型,那么 CompletableFuture 可能更加适合。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com