前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程之线程池(三)

多线程之线程池(三)

作者头像
OPice
发布2019-10-23 22:44:37
3860
发布2019-10-23 22:44:37
举报
文章被收录于专栏:D·技术专栏D·技术专栏

线程池

  1. 线程的创建销毁会伴随着系统开销,影响效率
  2. 线程并发数量过多,抢占资源导致系统阻塞
  3. 对线程进行管理

创建线程池的方式

代码语言:javascript
复制
//五个参数的构造函数
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue)

//六个参数的构造函数-1
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory)

//六个参数的构造函数-2
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          RejectedExecutionHandler handler)

//七个参数的构造函数
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
  • int corePoolSize

核心线程数

  • int maximumPoolSize

最大线程数

  • keepAliveTime

非核心线程的超时时长,如果设置allowCoreThreadTimeOut = true ,核心线程也会遵循这个超时时间

  • TimeUnit unit

超时时间单位: NANOSECONDS : 1微毫秒 = 1微秒 / 1000 MICROSECONDS : 1微秒 = 1毫秒 / 1000 MILLISECONDS : 1毫秒 = 1秒 /1000 SECONDS : 秒 MINUTES : 分 HOURS : 小时 DAYS : 天

  • BlockingQueue<Runnable> workQueue

存放等待执行的Runnable,如果所有核心线程都在执行,新任务会放在队列里,如果队列满了,创建非核心线程执行任务。 1、 SynchronousQueue 队列中的任务直接交给线程处理,不保留 2、 LinkedBlockingQueue 当前线程数小于核心线程,新建一个线程来执行任务,等于核心线程数,将任务放入队列中 3、ArrayBlockingQueue 指定队列长度。如果当前线程数超过核心线程数,创建非核心线程数,当队列和maximumPoolSize都满了,发生错误 4、DelayQueue 队列中元素实现Delayed接口,达到了指定延时时间执行任务

  • ThreadFactory threadFactory

对创建的线程可以起别名

  • RejectedExecutionHandler handler

线程拒绝策略,针对队列中线程满的情况 ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。 ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

ThreadPoolExecutor的策略

1、线程数没有到corePoolSize,新建一个核心线程执行任务 2、线程数达到了corePoolSize,将任务放在队列中 3、队列满了,新建非核心线程处理 4、队列满了,总线程数达到了maximumPoolSize,由RejectedExecutorHandler处理。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.08.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 线程池
  • 创建线程池的方式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档