线程池之jdk1.8 Executors创建线程池的几种方式

 更新时间:2024年08月06日 16:49:06   作者:Ahuuua  
这篇文章主要介绍了线程池之jdk1.8 Executors创建线程池的几种方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1、newFixedThreadPool - 定长线程池

创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。

在任何时候,线程最多都是活动的处理任务。如果在所有线程都处于活动状态时提交其他任务,它们将在队列中等待,直到有线程可用。

如果任何线程在关机前的执行过程中由于故障而终止,那么如果需要执行后续任务,将有一个新线程替代它。

池中的线程将一直存在,直到显式关闭。

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory){
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>(),
                                      threadFactory);
}

2、newSingleThreadExecutor - 单一线程池

创建一个执行器,该执行器使用一个工作线程在无界队列上运行。

(但是请注意,如果此单线程在关机前的执行过程中由于故障而终止,那么如果需要执行后续任务,将使用一个新线程代替它。)

任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态。

与其他等效的newFixedThreadPool(1)不同,返回的执行器保证不可重新配置以使用其他线程。

    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>(),
                                    threadFactory));
    }

newSingleThreadExecutor和newFixedThreadPool(1)区别

3、newCachedThreadPool - 缓存线程池

创建一个线程池,该线程池根据需要创建新线程,但在以前构造的线程可用时将重用这些线程。

这些池通常会提高执行许多短期异步任务的程序的性能。

调用execute将重用以前构造的线程(如果可用)。

如果没有可用的现有线程,将创建一个新线程并将其添加到池中。

60秒未使用的线程将被终止并从缓存中删除。

因此,闲置足够长时间的池不会消耗任何资源。

请注意,可以使用ThreadPoolExecutor构造函数创建具有类似属性但不同细节(例如超时参数)的池。

    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
 public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>(),
                                      threadFactory);
    }

4、newScheduledThreadPool - 调度线程池

创建一个线程池,该线程池可以安排命令在给定延迟后运行,或定期执行。

参数:

corePoolSize – 池中要保留的线程数,即使它们处于空闲状态

    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
    public static ScheduledExecutorService newScheduledThreadPool(
            int corePoolSize, ThreadFactory threadFactory) {
        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
    }

5、newSingleThreadScheduledExecutor - 单线程调度线程池

创建一个单线程执行器,该执行器可以安排命令在给定延迟后运行,或定期执行。

(但是请注意,如果此单线程在关机前的执行过程中由于故障而终止,那么如果需要执行后续任务,将使用一个新线程代替它。)

任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态。

与其他等效的newScheduledThreadPool(1)不同,返回的执行器保证不可重新配置以使用其他线程。

    public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
        return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1));
    }
    public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {
        return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1, threadFactory));
    }

6、newWorkStealingPool - 抢占操作线程池

创建一个线程池,该线程池维护足够多的线程以支持给定的并行度级别,并且可以使用多个队列来减少争用。

并行级别对应于积极参与或可参与任务处理的最大线程数。

线程的实际数量可能会动态增长和收缩。

工作窃取池不保证提交任务的执行顺序。

参数:

并行度——目标并行度级别

    public static ExecutorService newWorkStealingPool(int parallelism) {
        return new ForkJoinPool
            (parallelism,
             ForkJoinPool.defaultForkJoinWorkerThreadFactory,
             null, true);
    }
    public static ExecutorService newWorkStealingPool() {
        return new ForkJoinPool
            (Runtime.getRuntime().availableProcessors(),
             ForkJoinPool.defaultForkJoinWorkerThreadFactory,
             null, true);
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现精准Excel数据排序的方法详解

    Java实现精准Excel数据排序的方法详解

    在数据处理或者数据分析的场景中,需要对已有的数据进行排序,在Excel中可以通过排序功能进行整理数据,而在Java中,则可以借助Excel表格插件对数据进行批量排序,下面我们就来学习一下常见的数据排序方法吧
    2023-10-10
  • SpringBatch从入门到精通之StepScope作用域和用法详解

    SpringBatch从入门到精通之StepScope作用域和用法详解

    这篇文章主要介绍了SpringBatch从入门到精通之StepScope作用域和用法详解,主要包括IOC容器中几种bean的作用范围以及可能遇到的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • IDEA配置maven环境的详细教程(Unable to import maven project报错问题的解决)

    IDEA配置maven环境的详细教程(Unable to import maven project报错问题的解决)

    这篇文章主要介绍了IDEA配置maven环境的详细教程(Unable to import maven project问题的解决),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • java实现推箱子小游戏

    java实现推箱子小游戏

    这篇文章主要为大家详细介绍了java实现推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Spring IOC与DI核心重点分析

    Spring IOC与DI核心重点分析

    IOC也是Spring的核心之一了,之前学的时候是采用xml配置文件的方式去实现的,后来其中也多少穿插了几个注解,但是没有说完全采用注解实现。那么这篇文章就和大家分享一下,全部采用注解来实现IOC + DI
    2022-10-10
  • java中"==" 与equals方法的使用

    java中"==" 与equals方法的使用

    本篇文章介绍了,在java中"==" 与equals方法的使用。需要的朋友参考下
    2013-04-04
  • 哲学家就餐问题中的JAVA多线程学习

    哲学家就餐问题中的JAVA多线程学习

    哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题,下面我们就看一下JAVA多线程如何做
    2013-11-11
  • Spring Cloud 通过 Gateway webflux实现网关异常处理

    Spring Cloud 通过 Gateway webflux实现网关异常处理

    在某一个服务中出现异常,通过@ControllerAdvice + @ExceptionHandler 统一异常处理,即使在微服务架构中,也可以将上述统一异常处理放入到公共的微服务中,这样哪一个微服务需要,直接引入模块,本文重点介绍Spring Cloud 通过 Gateway webflux实现网关异常处理,一起看看吧
    2023-11-11
  • java中文转拼音工具类详解

    java中文转拼音工具类详解

    这篇文章主要为大家详细介绍了java中文转拼音工具类的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • 手把手带你实现一个萌芽版的Spring容器

    手把手带你实现一个萌芽版的Spring容器

    大家好,我是老三,Spring是我们最常用的开源框架,经过多年发展,Spring已经发展成枝繁叶茂的大树,让我们难以窥其全貌,这节,我们回归Spring的本质,五分钟手撸一个Spring容器,揭开Spring神秘的面纱
    2022-03-03

最新评论