java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java创建线程池

Java创建线程池的方式实现

作者:被猫枕的咸鱼

本文主要介绍了创建线程池的方式,包括三种方式,第一种是使用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创建线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文