Java 之 JUC _线程池

实现多线程的方法之一:线程池

一、线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。

                        避免创建与销毁额外开销,提高了响应的速度

二、线程池的体系结构:

       java.util.concurrent.Executor:负责线程的使用与调度的根接口

             |–ExecutorService 子接口:线程池的主要接口,

                 |–ThreadPoolExecutor :线程池的实现类,继承AbstractExecutorService抽象类(实现了ExecutorService接口),

                 |–ScheduledExecutorService 子接口:负责线程的调度,继承ExecutorService 接口,

                     |–ScheduledThreadPoolExecutor  :继承ThreadPoolExecutor ,实现ScheduledExecutorService

《Java 之 JUC _线程池》

 1、ThreadPoolExecutor的部分参数:

     corePoolSize:核心池的大小,默认情况下,在创建了线程池之后,线程池中线程数为 0,当有任务来之后,就会创建一个线程去执

                             行任务,当线程池中线程数达到 corePoolSize 后,就把任务放在任务缓存队列中。

                                  1)、核心线程会一直存活,及时没有任务需要执行

                                  2)、当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理

                                  3)、设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭

      maxmumPoolSize:线程池中最大线程数

                                            1)、当线程数>=corePoolSize,且任务队列已满时,线程池会创建新线程来处理任务

                                            2)、当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常

     keepAliveTime:线程池中超过corePoolSize数目的空闲线程最大存活时间

                               1)、默认情况下,当线程池中线程数>corePoolSize 时,Keeplivetime 才起作用,直到线程数不大于 corePoolSize

                               2)、可以allowCoreThreadTimeOut(true)使得核心线程也存在有效时间

workQueue:阻塞队列,用来存放等待被执行的任务

threadFactory:线程工厂,用来创建线程

2、线程池的五种状态

Running:当线程池创建后,初始为 running 状态,能够接收新任务,以及对已添加的任务进行处理

ShutDown:调用 shutdown 方法后,处 shutdown 状态,此时不再接受新的任务,但能处理已有的任务

Stop:调用 shutdownnow 方法后,进入 stop 状态,不再接受新的任务,并且会尝试终止正在执行的任务

Tidying:当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING,或者当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING;

Terminated: 线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED

3、任务提交到线程池的操作

1)、若当前线程池中线程数<corepoolsize,则每来一个任务就创建一个线程去执行。

2)、若当前线程池中线程数>=corepoolsize,会尝试将任务添加到任务缓存队列中去,若添加成功,则任务会等待空闲线程将其取出执行,若添加失败,则尝试创建线程去执行这个任务

3)、若当前线程池中线程数>= Maximumpoolsize,则采取拒绝策略(有 4 种, 1) abortpolicy 丢弃 任 务 , 抛 出 RejectedExecutionException 2 ) discardpolicy 拒 绝 执 行 , 不 抛 异 常 3 )discardoldestpolicy 丢弃任务缓存队列中最老的任务,并且尝试重新提交新的任务 4)callerrunspolicy 有反馈机制,使任务提交的速度变慢)。

三、工具类:Executors

    ExecutorService newFixedThreadPool():创建固定大小的线程池

    ExecutorService newCachedThreadPool():缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量

    ExecutorService newSingleThreadExecutor():创建单个线程池,线程池中只有一个线程

    ScheduledExecutorService newScheduledThreadPool():创建固定大小的线程池,可以延迟或定时执行任务。

用例:

public class TestThreadPool {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);

        //1、Callable
        List<Future<Integer>> list = new ArrayList<>();

        for (int i=0;i<10;i++){
            Future<Integer> future = pool.submit(new Callable<Integer>() {

                @Override
                public Integer call() throws Exception {
                    int sum = 0;
                    for (int i=0;i<=100;i++){
                        sum += i;
                    }
                    return sum;
                }
            });
            list.add(future);
        }

        pool.shutdown();

        for (Future future : list){
            System.out.println(future.get());

       }
}
}
    原文作者:JUC
    原文地址: https://blog.csdn.net/miaomiao_Liu/article/details/79468379
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞