Java线程池

什么是线程池?

池化概念 (可重复利用、减少系统资源占用、加快使用连接的过程) 

 

为什么使用线程池?

降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;

提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;

提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控

提供更强大的功能,延时定时线程池。可以帮助我们执行一些延时任务或定时任务。

 

jdk1.8线程池结构图

 

 

 

 

 

Executor (接口)

一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command),

execute()  (执行任务代码)

执行任务代码

 public static void main(String[] args) throws IOException {

        Executor e = new Executor() {
            @Override
            public void execute(Runnable r) {
                System.out.println("execute");
                r.run();

            }
        };
      
        e.execute(()->{
            System.out.println("线程1");
        });
e.execute(()->{ System.out.println("线程2"); }); }

  

 

  

ExecutorService  (接口)

是一个比Executor使用更广泛的子类接口,其提供了生命周期管理的方法,以及可跟踪一个或多个异步任务执行状况返回Future的方法

提供了管理Eecutor生命周期的方法,ExecutorService的生命周期包括了:运行  关闭和终止三种状态。

ExecutorService在初始化创建时处于运行状态。

shutdown方法等待提交的任务执行完成并不再接受新任务,在完成全部提交的任务后关闭

shutdownNow方法将强制终止所有运行中的任务并不再允许提交新任务

关闭线程池

ExecutorService提供了shutDown()和shutDownNow()两个函数来关闭线程池,底层还是通过逐个调用线程的interrupt()函数来实现中断线程从而关闭线程池的。

    AbstractExecutorService

    ExecutorService执行方法的默认实现

      ForkJoinPool

      将大任务分解成若干个小任务,当小任务均执行结束后,将任务做一个整合。

    ThreadPoolExecutor(实现类)

      线程池,可以通过调用Executors以下静态工厂方法来创建线程池并返回一个ExecutorService对象。

      使用线程池主要使用的就是ThreadPoolExecutor类

      它的核心参数有7个常用的有5个

      

 

 

      

参数名 作用
corePoolSize 核心线程池大小
maximumPoolSize 最大线程池大小
keepAliveTime 线程池中超过corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间
TimeUnit keepAliveTime时间单位
workQueue 阻塞任务队列
threadFactory 新建线程工厂
RejectedExecutionHandler 当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理

 

      

    ScheduledExecutorService

    一个可定时调度任务的接口

      ScheduledThreadPoolExecutor

      ScheduledExecutorService的实现,一个可定时调度任务的线程池

 

线程池执行流程

 

 

 

线程池应用场景

  在之前做过的项目中短信验证的功能用到了线程池,点击发送验证码,我们为了快速响应用户,会把当前发送验证码的过程放入到线程池中执行,

  1. 创建一个线程池(一定要单例使用spring的@bean注解、注入使用@resource)
  2. 当某一个位置需要使用这个线程池的时候,直接注入使用即可

  线程池只是处理任务,它不关心你的任务是什么

 

 

ThreadPoolExecutor中execute、submit方法的区别

 

execute没有返回值接受runnable

 

submit有返回值接受runnable和callable

 

 

线程池的关闭

shutdown()   SHUTDOWN状态

shutdown函数会把线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。

 

shutdownNow()    STOP状态

shutdownNow方法会先将线程池状态修改为STOP,然后调用线程池里的所有线程的interrupt方法,并把工作队列中尚未来得及执行的任务清空到一个List中返回,getTask()方法返回null,从而线程退出 。但是ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。

 

 

 

 

 

 

 

 

posted @ 2021-05-13 11:40  初心么  阅读(103)  评论(0)    收藏  举报