Java创建线程池的方式实现

 更新时间:2024年12月12日 10:02:34   作者:被猫枕的咸鱼  
本文主要介绍了创建线程池的方式,包括三种方式,第一种是使用Executors框架,第二种是使用ThreadPoolExecutor,第三种是使用ForkJoinPool,感兴趣的可以了解一下

概括

主要是用来介绍创建线程池的方式。主要有三种,第一种是使用Executors框架,第二种是使用ThreadPoolExecutor,第三种是使用ForkJoinPool。

第一种是使用Executors框架

Executors框架提供了一些静态方法来创建线程池,主要有以下几种:

newFixedThreadPool(int nThreads):创建一个固定大小的线程池,线程池中的线程数量固定,不会增加也不会减少,适用于处理有限数量的并发任务。

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

newCachedThreadPool():创建一个可缓存的线程池,线程池中的线程数量不固定,可以根据需要增加或者减少。当线程池中的线程空闲时,会被回收。适用于处理较短生命周期的任务。

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

newSingleThreadExecutor():创建一个只有一个线程的线程池,线程池中的线程数量固定为1。

ExecutorService executorService = Executors.newSingleThreadExecutor();

newScheduledThreadPool(int corePoolSize):创建一个可以定时或者周期性执行任务的线程池,线程池中的线程数量固定,可以根据需要增加或者减少。

/**
 * schedule():调度一个任务在指定的延迟后执行一次。
 * scheduleAtFixedRate():调度任务以固定的频率周期性执行,任务之间的间隔时间是固定的。
 * scheduleWithFixedDelay():调度任务以固定的延迟时间周期性执行,任务之间的延迟是固定的。
 */
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);

// 调度一个任务,延迟 3 秒后执行
scheduledThreadPool.schedule(() -> {
System.out.println("任务在延迟 3 秒后执行,当前线程: " + Thread.currentThread().getName());
}, 3, TimeUnit.SECONDS);

scheduledThreadPool.scheduleAtFixedRate(() -> {
System.out.println("任务在固定间隔 2 秒执行,当前线程: " + Thread.currentThread().getName());
}, 0, 2, TimeUnit.SECONDS); // 第一个参数 0 是初始延迟,第二个参数 2 是间隔时间

// 每 2 秒执行一次任务,任务执行完后等待 2 秒再执行下一个
scheduledThreadPool.scheduleWithFixedDelay(() -> {
System.out.println("任务在固定延迟 2 秒执行,当前线程: " + Thread.currentThread().getName());
}, 0, 2, TimeUnit.SECONDS); // 第一个参数 0 是初始延迟,第二个参数 2 是延迟时间

第二种是使用ThreadPoolExecutor

ThreadPoolExecutor是Java中线程池的真正实现类,它提供了更多的配置选项,可以更灵活地控制线程池的行为。ThreadPoolExecutor的构造函数有多个重载版本,可以根据需要选择合适的构造函数。

/**
 常见的拒绝策略:
 AbortPolicy(默认):直接抛出 RejectedExecutionException 异常。
 CallerRunsPolicy:由调用者线程处理任务。
 DiscardPolicy:丢弃任务。
 DiscardOldestPolicy:丢弃队列中最旧的任务,并尝试提交当前任务。`
 **/
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize, // 核心线程数
    maximumPoolSize, // 最大线程数
    keepAliveTime, // 空闲线程存活时间
    unit, // 存活时间单位
    workQueue, // 任务队列
    threadFactory, // 线程工厂
    handler // 拒绝策略
);

//示例
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,  // 核心线程数
        10, // 最大线程数
        60L, // 空闲线程最大存活时间(单位:秒)
        TimeUnit.SECONDS, // 时间单位
        new LinkedBlockingQueue<Runnable>(100), // 阻塞队列
        Executors.defaultThreadFactory(), // 默认线程工厂
        new ThreadPoolExecutor.CallerRunsPolicy()// 拒绝策略
);

第三种是使用ForkJoinPool

// 如果你需要处理大量的计算密集型任务,并且任务可以分割成更小的子任务,可以使用 ForkJoinPool。它是一种用于并行计算的线程池。
ForkJoinPool forkJoinPool = new ForkJoinPool(3);

到此这篇关于Java创建线程池的方式实现的文章就介绍到这了,更多相关Java创建线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java线程之间通信的几种方式详解

    Java线程之间通信的几种方式详解

    在 Java 中,线程之间的通信是通过共享内存模型来实现的,线程通过共享的对象和变量来交换数据,为了确保线程间通信的正确性,Java 提供了一系列机制来实现线程安全、同步和通信,以下是常用的几种线程间通信的方式,以及它们的使用方法和场景,需要的朋友可以参考下
    2025-03-03
  • Java图形化编程中的键盘事件设计简介

    Java图形化编程中的键盘事件设计简介

    这篇文章主要介绍了Java图形化编程中的键盘事件设计,是Java的GUI编程当中的基础部分,需要的朋友可以参考下
    2015-10-10
  • Springboot使用cache缓存过程代码实例

    Springboot使用cache缓存过程代码实例

    这篇文章主要介绍了Springboot使用cache缓存过程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java实现synchronized锁同步机制

    Java实现synchronized锁同步机制

    synchronized是java内置的同步锁实现,本文就详细的介绍一下Java实现synchronized锁同步机制,具有一定的参考价值,感兴趣的可以了解一下
    2021-11-11
  • 详解Springboot之接收json字符串的两种方式

    详解Springboot之接收json字符串的两种方式

    这篇文章主要介绍了Springboot之接收json字符串的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java中拼接字符串String的N种方法总结

    Java中拼接字符串String的N种方法总结

    字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起,下面这篇文章主要给大家介绍了关于Java中拼接String的N种方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Maven使用Nexus创建私服的实现

    Maven使用Nexus创建私服的实现

    本文主要介绍了Maven使用Nexus创建私服的实现,通过建立自己的私服,就可以降低中央仓库负荷、节省外网带宽、加速Maven构建、自己部署构件等,从而高效地使用Maven,感兴趣的可以了解一下
    2024-04-04
  • SpringBoot配置文件启动加载顺序的方法步骤

    SpringBoot配置文件启动加载顺序的方法步骤

    SpringBoot的启动加载顺序涉及多个步骤和组件,通过分层和优先级机制加载配置文件,确保在启动时正确配置应用程序,本文就来介绍一下SpringBoot配置文件启动加载顺序的方法步骤,感兴趣的可以了解一下
    2024-11-11
  • 深入解析Spring AI框架如何在Java应用中实现智能化交互的关键

    深入解析Spring AI框架如何在Java应用中实现智能化交互的关键

    本文详细介绍了SpringAI框架在Java应用中的应用,包括实体类映射、函数回调等核心功能的实现,通过源码分析,帮助开发者更好地理解和使用这些高级特性,提升业务效率,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • SpringBoot集成阿里云OSS图片上传

    SpringBoot集成阿里云OSS图片上传

    这篇文章主要为大家详细介绍了SpringBoot集成阿里云OSS图片上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08

最新评论