专栏名称: java一日一条
主要是讲解编程语言java,并且每天都推送一条关于java编程语言的信息
目录
相关文章推荐
Java编程精选  ·  字节员工自曝:在强调一遍OD ... ·  昨天  
芋道源码  ·  如何实现一个合格的分布式锁 ·  昨天  
51好读  ›  专栏  ›  java一日一条

Java 线程 Executor 框架详解与使用

java一日一条  · 公众号  · Java  · 2017-09-01 07:20

正文

请到「今天看啥」查看全文


FixedThreadPool的corePoolSize和maximumPoolSize都被设置为创建FixedThreadPool时指定的参数nThreads。当线程池中的线程数大于corePoolSize时,keepAliveTime为多余的空闲线程等待新任务的最长时间,超过这个时间后多余的线程将被终止。这里把keepAliveTime设置为0L,意味着多余的空闲线程会被立即终止

运行过程

下面是FixedThreadPool运行过程示意图

  • 1、如果当前运行的线程数少于corePoolSize,则创建新线程来执行任务。

  • 2、在线程池完成预热之后(当前运行的线程数等于corePoolSize),将任务加入LinkedBlockingQueue。

  • 3、线程执行完1中的任务后,会在循环中反复从LinkedBlockingQueue获取任务来执行。

FixedThreadPool使用无界队列LinkedBlockingQueue作为线程池的工作队列(队列的容量为Integer.MAX_VALUE)。使用无界队列作为工作队列会对线程池带来如下影响

  • 1、当线程池中的线程数达到corePoolSize后,新任务将在无界队列中等待,因此线程池中的线程数不会超过corePoolSize。

  • 2、由于1,使用无界队列时maximumPoolSize将是一个无效参数。

  • 3、由于1和2,使用无界队列时keepAliveTime将是一个无效参数。

  • 4、由于使用无界队列,运行中的FixedThreadPool(未执行方法shutdown()或shutdownNow())不会拒绝任务(不会调用RejectedExecutionHandler.rejectedExecution方法)。

使用场景

FixedThreadPool适用于为了满足资源管理的需求,而需要限制当前线程数量的应用场景,它适用于负载比较重的服务器

SingleThreadExecutor

初始化

创建使用单个线程的SingleThread-Executor

SingleThreadExecutor的corePoolSize和maximumPoolSize被设置为1。其他参数与FixedThreadPool相同。SingleThreadExecutor使用无界队列LinkedBlockingQueue作为线程池的工作队列(队列的容量为Integer.MAX_VALUE)。SingleThreadExecutor使用无界队列作为工作队列对线程池带来的影响与FixedThreadPool相同

运行过程

下图是SingleThreadExecutor的运行过程示意图

  • 1、如果当前运行的线程数少于corePoolSize(即线程池中无运行的线程),则创建一个新线程来执行任务。

  • 2、在线程池完成预热之后(当前线程池中有一个运行的线程),将任务加入LinkedBlockingQueue。

  • 3、线程执行完1中的任务后,会在一个无限循环中反复从LinkedBlockingQueue获取任务来执行。

使用场景

SingleThreadExecutor适用于需要保证顺序地执行各个任务;并且在任意时间点,不会有多个线程是活动的应用场景。







请到「今天看啥」查看全文