线程池相关知识

本文详细解读线程池的四个核心组件,包括线程池管理器、工作线程、任务接口和任务队列,以及newSingleThreadExecutor、newFixedThreadPool和ScheduledThreadPoolExecutor等常见线程池的使用与区别。重点介绍了定时任务的scheduleAtFixedRate和scheduleWithFixedDelay方法。

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

线程池

线程池参数:

线程参数

  • corePoolSize :核心线程数
  • maximumPoolSize :最大线程数
  • keepAliveTime :线程空闲存活时间
  • unit :空闲线程存活时间单位
  • workQueue :工作队列
  • threadFactory :线程工厂
  • handler :拒绝策略

四个基本组成部分

  • 线程池管理器(ThreaPool)
    顾名思义,管理线程池,如创建、销毁线程池或者添加新任务
  • 工作线程(PoolWoker)
    线程池中的线程,用于循环执行任务,若没有任务则处于等待状态
  • 任务接口
    任务必须实现的接口,用于工作线程调度任务的执行
  • 任务队列
    存放还没执行的任务,用于缓冲任务的执行

常用线程池

1、newSingleThreadExecutor

单线程的线程池;线程池中只有一个线程在工作,如果当前线程执行异常停止了,那么线程池会新创建一个线程代替它去执行任务;保证任务的执行顺序按照任务的提交顺序执行

2、newFixedThreadPool

固定大小的线程池;线程数随着任务数增加,如果达到固定线程池固定线程数则不再增加线程。如果再处于最大线程数时有线程异常而结束,则会新建线程补充,保证最大线程数

3、newCacheThreadPool

可缓存线程池;如果线程池长度超过任务数,则可灵活的回收空闲线程;当任务数增加时,可创建新的线程来执行任务;

4、ScheduledThreadPoolExecutor

定长线程池;支持定时和周期性任务执行

  • 创建方法:
 1.	ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
 2. ScheduledThreadPoolExecutor exec =new ScheduledThreadPoolExecutor(1);
4.1定时任务线程池的scheduleAtFixedRate和scheduleWithFixedDelay方法区别
4.1.1 scheduleAtFixedRate :

按照固定频率来执行任务;分两种情况:

  • 1、任务执行时间 < period ,则任务之间执行间隔时间等于period
public class NewScheduledThreadExecutorTest {

   public static void main(String[] args) {
       ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);

       exec.scheduleAtFixedRate(new Runnable(){//任务执行时间5s, period值为2s
           @Override
           public void run() {
               System.out.println("AtFixedRate-----" + System.currentTimeMillis()/1000);
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }}, 1000, 2000, TimeUnit.MILLISECONDS);
   }
}

执行结果
执行时间间隔为2秒,即period的值

  • 2、任务执行时间 > period,则任务之间执行间隔时间等于任务执行时间,即任务执行完马上执行下一个任务

public class NewScheduledThreadExecutorTest {

  public static void main(String[] args) {
      ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);

      exec.scheduleAtFixedRate(new Runnable(){//任务执行时间5s, period值为2s
          @Override
          public void run() {
              System.out.println("AtFixedRate-----" + System.currentTimeMillis()/1000);
              try {
                  Thread.sleep(5000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }}, 1000, 2000, TimeUnit.MILLISECONDS);
  }
} 

执行结果
可以看出间隔时间都是5s,即任务的执行时间

4.1.2scheduleWithFixedDelay:

按照固定延迟时间来执行任务,受任务本身执行时间限制

  • 比如delay的值是2s;任务执行时间是1s;执行任务时间间隔为3s
public class NewScheduledThreadExecutorTest {

    public static void main(String[] args) {
        ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);

        exec.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                System.out.println("withFixedDelay:" + System.currentTimeMillis()/1000);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 1000, 1000, TimeUnit.MILLISECONDS);
    }
}

执行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值