【Java】Java并发线程之线程池

Java并发线程之线程池

入门小站发布于 30 分钟前

Thread的弊端

  • 每次new Thread() 创建对象,性能差。
  • 线程缺乏统一管理,可能无限制创建线程,相互竞争,有可能占用过多系统资源导致死机或OOM。
  • 不能多执行,定期执行,线程中断

线程池的优点

  • 重用存在的线程,减少对象创建,消亡的开销,性能佳,降低资源消耗。
  • 可以控制最大并发线程数,提高系统资源利用率,同时避免过多资源竞争,避免阻塞,提高响应速度。
  • 提供定时执行,定期执行,单线程,并发数控制等功能,以提高线程的可管理性。

ThreadPoolExecutor介绍

构造函数和参数

【Java】Java并发线程之线程池

public class ThreadPoolExecutor extends AbstractExecutorService {

/** 构造函数 1 */

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue) {}

/** 构造函数 2 */

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue,

ThreadFactory threadFactory) {}

/** 构造函数 3 */

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue,

RejectedExecutionHandler handler) {}

/** 构造函数 4 */

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler) {}

}

【Java】Java并发线程之线程池

构造器中各个参数的含义

  • prestartCoreThread() : 预创建一个核心线程,使其闲置等待工作。
  • prestartAllCoreThreads() : 启动所有核心线程,导致它们空闲地等待工作。

  • TimeUnit.DAYS : 以 天 为单位 ;
  • TimeUnit.HOURS : 以 小时 为单位 ;
  • TimeUnit.MINUTES : 以 分钟 为单位 ;
  • TimeUnit.SECONDS : 以 秒 为单位 ;
  • TimeUnit.MILLISECONDS : 以 毫秒 为单位 ;
  • TimeUnit.MICROSECONDS : 以 微秒 为单位 ;
  • TimeUnit.NANOSECONDS : 以 纳秒 为单位 ;

  • ArrayBlockingQueue:基于数组的先进先出队列,创建时必须指定大小。
  • LinkedBlockingQueue:基于链表的先进先出队列,若果创建时没有指定此队列的大小,则默认为Integer.MAX_VALUE
  • SynchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是直接新建一个线程来执行新的任务。

  • ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常
  • ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
  • ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行新提交的任务。

ThreadPoolExecutor执行execute方法分下面4种情况

  • 如果当前运行的线程少于corePoolSize,则创建新的线程来执行任务(执行这一步骤需要获取全局锁)
  • 如果运行的线程等于或者多于corePoolSize,则将任务加入到BlockingQueue

  • 如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务(执行这一步骤需要获取全局锁)
  • 如果创建新线程将当前运行的线程超出maxnumPoolSize,任务被拒绝,并调用RejectedExecutionHandler.rejectedExecution()方法。

关注微信公众号:【入门小站】,解锁更多知识点

【Java】Java并发线程之线程池

阅读 26发布于 30 分钟前

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议

avatar

入门小站

rumenz.com

41 声望

2 粉丝

0 条评论

得票时间

avatar

入门小站

rumenz.com

41 声望

2 粉丝

宣传栏

Thread的弊端

  • 每次new Thread() 创建对象,性能差。
  • 线程缺乏统一管理,可能无限制创建线程,相互竞争,有可能占用过多系统资源导致死机或OOM。
  • 不能多执行,定期执行,线程中断

线程池的优点

  • 重用存在的线程,减少对象创建,消亡的开销,性能佳,降低资源消耗。
  • 可以控制最大并发线程数,提高系统资源利用率,同时避免过多资源竞争,避免阻塞,提高响应速度。
  • 提供定时执行,定期执行,单线程,并发数控制等功能,以提高线程的可管理性。

ThreadPoolExecutor介绍

构造函数和参数

【Java】Java并发线程之线程池

public class ThreadPoolExecutor extends AbstractExecutorService {

/** 构造函数 1 */

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue) {}

/** 构造函数 2 */

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue,

ThreadFactory threadFactory) {}

/** 构造函数 3 */

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue,

RejectedExecutionHandler handler) {}

/** 构造函数 4 */

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler) {}

}

【Java】Java并发线程之线程池

构造器中各个参数的含义

  • prestartCoreThread() : 预创建一个核心线程,使其闲置等待工作。
  • prestartAllCoreThreads() : 启动所有核心线程,导致它们空闲地等待工作。

  • TimeUnit.DAYS : 以 天 为单位 ;
  • TimeUnit.HOURS : 以 小时 为单位 ;
  • TimeUnit.MINUTES : 以 分钟 为单位 ;
  • TimeUnit.SECONDS : 以 秒 为单位 ;
  • TimeUnit.MILLISECONDS : 以 毫秒 为单位 ;
  • TimeUnit.MICROSECONDS : 以 微秒 为单位 ;
  • TimeUnit.NANOSECONDS : 以 纳秒 为单位 ;

  • ArrayBlockingQueue:基于数组的先进先出队列,创建时必须指定大小。
  • LinkedBlockingQueue:基于链表的先进先出队列,若果创建时没有指定此队列的大小,则默认为Integer.MAX_VALUE
  • SynchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是直接新建一个线程来执行新的任务。

  • ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常
  • ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
  • ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行新提交的任务。

ThreadPoolExecutor执行execute方法分下面4种情况

  • 如果当前运行的线程少于corePoolSize,则创建新的线程来执行任务(执行这一步骤需要获取全局锁)
  • 如果运行的线程等于或者多于corePoolSize,则将任务加入到BlockingQueue

  • 如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务(执行这一步骤需要获取全局锁)
  • 如果创建新线程将当前运行的线程超出maxnumPoolSize,任务被拒绝,并调用RejectedExecutionHandler.rejectedExecution()方法。

关注微信公众号:【入门小站】,解锁更多知识点

【Java】Java并发线程之线程池

以上是 【Java】Java并发线程之线程池 的全部内容, 来源链接: utcz.com/a/107464.html

回到顶部