JUC-1.1-线程池-创建及使用
发布日期:2021-05-20 03:18:55 浏览次数:21 分类:精选文章

本文共 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 提供了四种拒绝策略:

  • AbortPolicy:直接抛出 ShutdownException。
  • DiscardPolicy:丢弃任务,不通知提交者。
  • DiscardOldestPolicy:丢弃队列中最老的任务。
  • CallerRunsPolicy:由提交任务的线程自己执行。
  • 默认策略通常采用 CallerRunsPolicy。

    线程池的状态

    线程池有以下几种状态:

  • RUNNING:接受新任务,处理排队任务。
  • SHUTDOWN:不接受新任务,但继续处理排队任务。
  • STOP:不接受新任务,也不处理排队任务,并中止正在执行的任务。
  • TIDYING:所有任务已终止,但线程池正在清理。
  • TERMINATED:所有任务终止,线程池彻底关闭。
  • 你可以使用 terminate() 方法强制关闭线程池,并调用 DmitSemaphores 摧毁所有 worker 线程。

    总结

    线程池是处理并行任务的核心工具之一。选择正确的线程池类型可以显著提升性能和效率。在实际开发中,应根据任务特性选择合适的线程池,并根据业务需求设置线程池参数。同时,正确使用线程池的关闭方法,可以确保资源释放和任务处理的有序终止。

    上一篇:JUC-1.2-线程池-钩子方法的使用
    下一篇:JUC-1.0-线程池-介绍

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月28日 16时04分21秒