
本文共 1915 字,大约阅读时间需要 6 分钟。
如何创建线程池?
在Java项目开发中,线程池是一个非常有用的工具。使用 Executors 类,我们可以轻松创建不同类型的线程池来处理任务。
固定数量线程池
使用 Executors.newFixedThreadPool() 创建固定数量的线程池。例如,以下代码创建一个核心线程数为5的线程池:
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(5);
这个线程池会用固定数量的线程来处理任务,当所有线程都忙完后,新提交的任务会被排队。
单线程池
如果你需要只用一个线程来处理所有任务,可以使用 Executors.newSingleThreadExecutor()。这类似于单核 CPU 的执行。
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
这个线程池只会使用一个核心线程,但它不会对线程池线程数量进行扩展。
可缓存线程池
Executor.newCachedThreadPool() 创建一个可以动态调整线程数量的线程池。它会根据需求自动增加和减少线程。
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
这种类型的线程池通常适用于 CPU 不是瓶颈任务,因为它可以根据任务负载自动调节线程数量。
定期及周期性任务线程池
如果你需要在定期时间执行任务,可以使用 Executors.newScheduledThreadPool()。它支持延迟执行和周期性执行。
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);// 延迟5秒执行scheduledExecutorService.schedule(new TestTask(), 5, TimeUnit.MINUTES);// 周期执行(每隔3秒执行一次)scheduledExecutorService.scheduleAtFixedRate(new TestTask(), 1, 3, TimeUnit.SECONDS);
线程池的关闭
使用 shutdown() 方法优雅关闭线程池:
newFixedThreadPool.shutdown();
当关闭线程池后,所有当前执行的任务会先完成,新的任务将被拒绝。
要检查线程池是否已关闭,可以调用 isShutdown() 方法。
newFixedThreadPool.isShutdown();
如果你希望线程池关闭后能够等待所有任务完成,可以调用 awaitTermination() 方法:
newFixedThreadPool.awaitTermination(60, TimeUnit.SECONDS);
此方法会阻塞,直到线程池所有任务完成或超时。
如果你想立即关闭线程池(不等待任务完成),可以使用 shutdownNow() 方法:
newFixedThreadPool.shutdownNow();
线程池的拒绝策略
线程池处理任务时可能会因为资源限制或关闭状态而拒绝任务。 Java 提供了四种拒绝策略:
默认策略通常采用 CallerRunsPolicy。
线程池的状态
线程池有以下几种状态:
你可以使用 terminate() 方法强制关闭线程池,并调用 DmitSemaphores 摧毁所有 worker 线程。
总结
线程池是处理并行任务的核心工具之一。选择正确的线程池类型可以显著提升性能和效率。在实际开发中,应根据任务特性选择合适的线程池,并根据业务需求设置线程池参数。同时,正确使用线程池的关闭方法,可以确保资源释放和任务处理的有序终止。
发表评论
最新留言
关于作者
