Java线程池

一、线程池的组成部分

线程池的核心类是ThreadPoolExecutor,查看其构造函数,参数最多的构造函数包含这几个部分

int corePoolSize:核心池大小

int maximumPoolSize:最大线程池大小

long keepAliveTime:线程空闲时任保留等待新任务提交的时间

TimeUnit unit:等待时间的单位

BolckingQueue<runnable> workQueue:工作队列,用于存储提交的新任务

ThreadFactory threadFactory:线程工厂,用于创建线程

RejectExecutionHandler handler:任务被拒绝执行时的处理方式,有四种:1.拒绝任务,抛出异常 2.直接丢弃任务 3.循环丢弃等待队列中最老的任务,并尝试提交该被拒绝的任务 4.将任务给主线程来执行

二、常用的Java线程池有哪几种

newCachedThreadPool():用来处理大量短时间工作的线程池,会试图缓存线程并进行重用,当无缓存线程可用时,会创建新的线程,当线程闲置超过60s(默认),则会终止线程并移除缓存

newFixedThreadPoolint (int nThreads):定长的线程池,任何时候最多只有nThreads个线程是活动的

newSingleThreadExecutor():工作线程数目限制为1,保证所有任务都顺序执行

newSingleThreadScheduledExecutor()/newScheduledThreadPoo(int corePoolSize):可以进行定时和周期性的调度

newWorkStealingPool(int parallelism):Java8新提供的方法,利用Work-Stealing算法,并行得处理任务

三、一个新任务提交到线程池,线程池的处理流程是什么样的

首先,判断线程数是否达到corePoolSize

  如果未达到,则创建一个新的线程执行任务

  如果已经达到,判断工作队列是否已满

    如果未满,则将新任务提交到工作队列中

    如果已满,判断线程数是否达到maximumPoolSize

      如果未达到,则创建新的线程执行该任务

      如果已经达到,则拒绝该任务,根据对应的handler进行处理

四、使用线程池有什么好处

1.减少创建线程和销毁线程的开销

2.任务提交后立刻有线程可以执行,加快执行速度

3.提供一些调度的方法

posted @ 2019-07-23 17:57  珞珈山的小狐狸  阅读(143)  评论(0)    收藏  举报