多线程:简单了解几种常见的线程池

常见线程池获得方式

1.自己new一个ThreadPoolExecutor,可自定义配置参数;
2.newCachedThreadPool;
3.newFixedThreadPool
4.newScheduledThreadPool;
5.newSingleThreadExecutor;

newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor是Excutors类的静态方法,直接调用,即可获得线程池;如:

ExecutorService  myThreadPool=Executors.newCachedThreadPool();

就会获得了一个线程池;

这五种线程池都是ExecutorService接口 的实现;(相当于兄弟,只是各有特点)
下面介绍其各自特点:

1.ThreadPoolExcutor

1.1源码:

在这里插入图片描述

1.2适用场景:

主要特点:可以自定义配置所有参数;
关键参数:核心线程数、最大线程数、等待队列长度、非核心线程空闲生存时间、生存时间的单位、线程工厂设置、线程不足时处理方式;

1.3关键参数说明:

核心线程数:线程池中,创建后不会因为长时间不用而销毁的数量;
最大线程数:线程池可拥有的最大线程数;
等待队列长度:当线程数量达到核心新线程数时,在来任务,线程池会将任务先放入等待队列;等待队列满了后,会继续创建线程执行任务(前提是没达到最大线程数);
非核心线程空闲生存时间:当线程任务较少时,非核心线程会在一段时间后自动销毁;
生存时间的单位:非核心线程,空闲时可生存时间的单位;
线程工厂:可以设置怎么创建线程,如设置线程名字等;
线程不足时的处理方式:可以配置,当任务数超过最大线程数,时的处理方式;如:抛出异常、返回给调用者处理等方式;

2.newCachedThreadPool

2.1源码:

在这里插入图片描述
相当于一个特殊的ThreadPoolExecutor;核心线程数为0,最大线程数为正整数的最大值(快相当于无限了);

2.2适用场景:

适合执行大量耗时较少的任务。没有核心线程,即没有任务时,它几乎不占用任何系统资源。

3.newFixedThreadPool

3.1源码:

在这里插入图片描述一个特殊的ThreadPoolExecutor;所有线程都是核心线程(初始化时可设定值),但其等待队列无限长,可以不断排队;

3.2适用场景:

线程数量固定的线程池,无限的任务队列,只有核心线程。最多只有nThreads个任务在并行处理,之后都在排队等待。

4.newScheduledThreadPool

4.1源码:
//ExecutorService  
 public static ScheduledExecutorService newScheduledThreadPool(
            int corePoolSize, ThreadFactory threadFactory) {
        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
    }
 //newScheduledThreadPool的方法
  public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
                                                  long initialDelay,
                                                  long period,
                                                  TimeUnit unit) {
        if (command == null || unit == null)
            throw new NullPointerException();
        if (period <= 0)
            throw new IllegalArgumentException();
        ScheduledFutureTask<Void> sft =
            new ScheduledFutureTask<Void>(command,
                                          null,
                                          triggerTime(initialDelay, unit),
                                          unit.toNanos(period));
        RunnableScheduledFuture<Void> t = decorateTask(command, sft);
        sft.outerTask = t;
        delayedExecute(t);
        return t;
    }

这个线程池可以通过方法设定首次执行任务延迟时间、后续每次的间隔时间;

4.2适用场景:

适用于需要周期性地或者延期执行任务;

5.newSingleThreadExecutor

5.1源码:
 public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

线程池中只有一个核心线程;单线程化的线程池,它只会用唯一的工作线程来执行任务;

5.2适用场景:

确保所有的任务都在一个线程中按顺序执行,使得这些任务之间不需要处理线程同步问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值