zoukankan      html  css  js  c++  java
  • 五种线程池的分类和作用


    1、newCachedThreadPool

    1.1.作用:创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactory 创建新线程。

    1.2.特征: 
    (1)线程池中数量没有固定,可达到最大值(Interger. MAX_VALUE) 
    (2)线程池中的线程可进行缓存重复利用和回收(回收默认时间为1分钟) 
    (3)当线程池中,没有可用线程,会重新创建一个线程

    1.3.创建方式:

    ExecutorService pool = Executors.newSingleThreadExecutor();

    一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

    使用方式:

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    public class ThreadPool {
        public static void main(String[] args) {
            ExecutorService pool = Executors.newSingleThreadExecutor();
            for (int i = 0; i < 10; i++) {
                pool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "	开始发车啦....");
                });
            }
        }
    }

    输出结果如下:

    pool-1-thread-1    开始发车啦....
    pool-1-thread-1    开始发车啦....
    pool-1-thread-1    开始发车啦....
    pool-1-thread-1    开始发车啦....
    pool-1-thread-1    开始发车啦....
    pool-1-thread-1    开始发车啦....
    pool-1-thread-1    开始发车啦....
    pool-1-thread-1    开始发车啦....
    pool-1-thread-1    开始发车啦....
    pool-1-thread-1    开始发车啦....

    从输出的结果我们可以看出,一直只有一个线程在运行。

    2、newFixedThreadPool

    2.1.作用:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。

    2.2.特征: 
    (1)线程池中的线程处于一定的量,可以很好的控制线程的并发量 
    (2)线程可以重复被使用,在显示关闭之前,都将一直存在 
    (3)超出一定量的线程被提交时候需在队列中等待

    2.3.创建方式: 
    (1)Executors.newFixedThreadPool(int nThreads);//nThreads为线程的数量 
    (2)Executors.newFixedThreadPool(int nThreads,ThreadFactory threadFactory);//nThreads为线程的数量,threadFactory创建线程的工厂方式

    ExecutorService pool = Executors.newFixedThreadPool(10);

    创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

    使用方式:

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    public class ThreadPool {
        public static void main(String[] args) {
            ExecutorService pool = Executors.newFixedThreadPool(10);
            for (int i = 0; i < 10; i++) {
                pool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "	开始发车啦....");
                });
            }
        }
    }

    输出结果如下:

    pool-1-thread-1    开始发车啦....
    pool-1-thread-4    开始发车啦....
    pool-1-thread-3    开始发车啦....
    pool-1-thread-2    开始发车啦....
    pool-1-thread-6    开始发车啦....
    pool-1-thread-7    开始发车啦....
    pool-1-thread-5    开始发车啦....
    pool-1-thread-8    开始发车啦....
    pool-1-thread-9    开始发车啦....
    pool-1-thread-10 开始发车啦.... 

    3、newSingleThreadExecutor

    3.1.作用:创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。

    3.2.特征: 
    (1)线程池中最多执行1个线程,之后提交的线程活动将会排在队列中以此执行

    3.3.创建方式: 
    (1)Executors.newSingleThreadExecutor() ; 
    (2)Executors.newSingleThreadExecutor(ThreadFactory threadFactory);// threadFactory创建线程的工厂方式

    创建方式:

    ExecutorService pool = Executors.newCachedThreadPool();

    创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲的线程,当任务数增加时,此线程池又添加新线程来处理任务。

    使用方式如上2所示。

    4、newScheduleThreadPool

    4.1.作用: 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

    4.2.特征: 
    (1)线程池中具有指定数量的线程,即便是空线程也将保留 
    (2)可定时或者延迟执行线程活动

    4.3.创建方式: 
    (1)Executors.newScheduledThreadPool(int corePoolSize);// corePoolSize线程的个数 
    (2)newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory);// corePoolSize线程的个数,threadFactory创建线程的工厂

    创建方式:

    ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);

    此线程池支持定时以及周期性执行任务的需求。

    使用方式:

    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    public class ThreadPool {
        public static void main(String[] args) {
            ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);
            for (int i = 0; i < 10; i++) {
                pool.schedule(() -> {
                    System.out.println(Thread.currentThread().getName() + "	开始发车啦....");
                }, 10, TimeUnit.SECONDS);
            }
        }
    }

    上面演示的是延迟10秒执行任务,如果想要执行周期性的任务可以用下面的方式,每秒执行一次

    //pool.scheduleWithFixedDelay也可以
    pool.scheduleAtFixedRate(() -> {
                    System.out.println(Thread.currentThread().getName() + "	开始发车啦....");
    }, 1, 1, TimeUnit.SECONDS);

    5、newSingleThreadScheduledExecutor

    作用: 创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。

    特征: 
    (1)线程池中最多执行1个线程,之后提交的线程活动将会排在队列中以此执行 
    (2)可定时或者延迟执行线程活动

    创建方式: 
    (1)Executors.newSingleThreadScheduledExecutor() ; 
    (2)Executors.newSingleThreadScheduledExecutor(ThreadFactory threadFactory) ;//threadFactory创建线程的工厂

    6.五种线程池的使用场景

    • newSingleThreadExecutor:一个单线程的线程池,可以用于需要保证顺序执行的场景,并且只有一个线程在执行。

    • newFixedThreadPool:一个固定大小的线程池,可以用于已知并发压力的情况下,对线程数做限制。

    • newCachedThreadPool:一个可以无限扩大的线程池,比较适合处理执行时间比较小的任务。

    • newScheduledThreadPool:可以延时启动,定时启动的线程池,适用于需要多个后台线程执行周期任务的场景。

    • newWorkStealingPool:一个拥有多个任务队列的线程池,可以减少连接数,创建当前可用cpu数量的线程来并行执行。

    7.线程池任务执行流程

    1. 当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
    2. 当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
    3. 当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
    4. 当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理
    5. 当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程
    6. 当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭

    参考资料:https://blog.csdn.net/admin1973/article/details/80451498

  • 相关阅读:
    理解老板是治疗职场心态最好的药
    给青年创业者, 风险投资的十大谎言
    在尊重人的基础上发展人
    预付费
    提高记忆力的最好方法是进行记忆力训练
    九绝招巧妙应付职场各类人
    写在深夜下班路上
    25岁不得不想的问题
    谈IT技术人员的创业转摘
    职场沟通必备8个黄金句型
  • 原文地址:https://www.cnblogs.com/aaaazzzz/p/12892108.html
Copyright © 2011-2022 走看看