java中创建线程池并使用

文章介绍了线程池的工作原理,包括核心线程数量、最大线程数、任务队列和拒绝策略等关键元素。当任务提交给线程池时,会根据核心线程数决定是否新建线程,或者将任务放入队列。如果队列满,会执行预设的拒绝策略,如AbortPolicy、DiscardPolicy等。还提供了一个ThreadPoolExecutor的配置代码示例,展示了如何创建和使用线程池。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程池说明

创建线程池,然后把任务丢给线程池。正常的过程是这样的,当你把任务提交给线程池的时候,它会看下当前正在跑的线程有多少个,如果说<你配置的核心线程数,它直接new一个线程去执行你的任务,如果达到了核心线程数,它会把任务放到一个队列里排队,等待空闲线程执行,如果队列满了,它会执行拒绝策略。

线程池核心元素

核心线程数量,最大线程数,空闲线程最大存活时间,时间单位,任务队列,创建线程工厂,任务的拒绝策略

任务拒绝策略

  1. ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。默认策略
  2. ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常,这是不推荐的做法。
  3. ThreadPoolExecutor.DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中。
  4. ThreadPoolExecutor.CallerRunsPolicy:调用任务的run()方法绕过线程池直接执行。(不用线程池,自己创建新线程执行任务)

代码示例

@Data
@Configuration
@ConfigurationProperties(prefix = "offline")
public class ThreadPoolConfig {
    /**
     * 核心线程数
     */
    private int core;

    /**
     * 最大线程数
     */
    private int max;

    /**
     * 队列长度
     */
    private int queue;

    /**
     * 当线程数大于核心数时,剩余空闲线程在终止前等待新任务的最大时间。
     */
    private int keepalive;
}
private final ThreadPoolExecutor threadPoolExecutor;
...
this.threadPoolExecutor = new ThreadPoolExecutor(threadPoolConfig.getCore(),
        threadPoolConfig.getMax(),
        threadPoolConfig.getKeepalive(),
        TimeUnit.SECONDS,
        new ArrayBlockingQueue<>(threadPoolConfig.getQueue()),
        new NamedThreadFactory("xxx", true),
        new ThreadPoolExecutor.CallerRunsPolicy());
this.threadPoolExecutor.allowCoreThreadTimeOut(true);
...
//有任务需要执行时,创建线程对象执行任务(池中线程数小于核心线程数时)。任务执行完毕,线程对象放入池子中。
threadPoolExecutor.execute(...);
//所有的任务执行完毕,关闭线程池。
threadPoolExecutor.shutdown();

注:线程池中 submit()和 execute()方法都是执行方法,区别在于execute()只能执行 Runnable 类型的任务,submit()可以执行 Runnable 和 Callable 类型的任务,Callable 类型的任务可以获取执行的返回值,而 Runnable 执行无返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值