并发编程——线程池

1.概述

如果并发的线程过多,而且执行的时间都非常短,如果这样,每次都要创建线程就会大大降低效率,我们可以通过线程池来解决,JDK5增加了内置线程池ThreadPollExecutor。

2.线程池的优点

1.重复利用,降低了线程频繁创建销毁消耗的时间。

2.统一的线程管理,由线程池来负责。

3.ThreadPollExecutor构造方法中各个参数的意义

  • corePoolSize:核心池的大小,默认情况下,刚创建出线程池,线程池的大小为0,来一个任务创建一个线程,除非事先创建好预备的线程。

  • maximumPoolSize:线程池的最大线程数,核心和非核心线程的总和。

  • keepAliveTime非核心池中非核心线程的保存时间

  • unit:keepAliveTime的时间单位。

  • workQueue:一个阻塞的队列,里面存放的是等待到核心池获取线程的任务。

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

  • handler:表示拒绝处理任务的策略,有四种。

4.线程池的执行

并发编程——线程池_第1张图片

执行流程

当一个任务要被执行时,会先看核心线程池是否已满,如果未满,则从核心池中获取线程,如果核心池满了,则尝试去添加到队列中,等待获取核心线程中中的资源,如果队列已满,则看非核心线程池是否已满,如果未满,则从非核心线程池中获取线程,如果非核心线程都满了,则需要执行拒绝任务的策略。

5.线程池中的队列

  • ArrayBlockingQueue:有一个数组实现的有界队列,创建时必须设置初始大小,按照先来后到的方式执行。

  • LinkedBlockingQueue:基于链表实现的队列,默认容量是Integer.MAX_VALUE,也可手动设置,按照先来后到的方式执行。

6.线程池的4种拒绝策略

  • AbortPolicy:直接抛出异常,阻止正常的工作。

  • DiscardOleddestPolicy:丢弃等待时间最长的任务。

  • DiscardPolicy:直接丢弃,不执行。

  • CallerRunsPolicy:交由提交任务的线程执行任务(例如:main)。

7.execute 与 submit 执行任务的区别

execute没有返回值,submit有返回值,通过get方法获取。

8.shutdownNow和shutdown关闭线程池方法的区别

shutdownNow表示现在立刻停止所有任务,对等待执行的任务全部取消。

shutdown表示停止再接收新的任务,还未执行完的任务继续执行。

 

你可能感兴趣的:(并发编程,java,jvm,开发语言)