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学院整理

    这篇文章主要介绍了Java接口的作用,涉及到接口的规范相关知识,需要的的朋友参考下
    2017-04-04
  • Spring连接Mysql数据库全过程

    Spring连接Mysql数据库全过程

    这篇文章主要介绍了Spring连接Mysql数据库全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 详解自动注册Gateway网关路由配置

    详解自动注册Gateway网关路由配置

    这篇文章主要为大家介绍了自动注册Gateway网关路由配置的方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Spring IoC容器知识点详解

    Spring IoC容器知识点详解

    在本篇文章里小编给各位整理的是关于Spring IoC容器的相关知识点内容,有需要的朋友们可以学习下。
    2019-09-09
  • SpringBoot分布式WebSocket的实现指南

    SpringBoot分布式WebSocket的实现指南

    在现代Web应用中,实时通信已成为基本需求,而WebSocket是实现这一功能的核心技术,本文将详细介绍如何在Spring Boot项目中实现分布式WebSocket,包括完整的技术方案、实现步骤和核心代码,需要的朋友可以参考下
    2025-10-10
  • 总结Java的Struts框架的异常处理方法

    总结Java的Struts框架的异常处理方法

    这篇文章主要介绍了Java的Struts框架的异常处理方法,Struts是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • Java结构型设计模式之享元模式示例详解

    Java结构型设计模式之享元模式示例详解

    享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实现方式。本文将通过示例详细讲解享元模式,感兴趣的可以了解一下
    2022-09-09
  • Java Swing组件定制RadioButton示例

    Java Swing组件定制RadioButton示例

    这篇文章主要介绍了Java Swing组件定制RadioButton,结合实例形式分析了java swing组件RadioButton相关属性设置与操作技巧,需要的朋友可以参考下
    2018-01-01
  • 一文深入分析java.lang.ClassNotFoundException异常

    一文深入分析java.lang.ClassNotFoundException异常

    这篇文章主要给大家介绍了关于java.lang.ClassNotFoundException异常的相关资料,java.lang.ClassNotFoundException是Java编程时经常会遇到的一个异常,它表示JVM在尝试加载某个类时未能找到该类,需要的朋友可以参考下
    2023-10-10
  • Java编程实现递增排序链表的合并

    Java编程实现递增排序链表的合并

    这篇文章主要介绍了Java编程实现递增排序链表的合并,两种方法,代码分享给大家,供需要的朋友参考。
    2017-10-10

最新评论