线程池

2019-04-14  本文已影响0人  蜗牛写java

背景

为什么出现线程池?

  1. 目前计算机CPU均为多核处理器,如果串行执行,必然造成资源上的浪费;
  2. 每次创建线程的时候,和销毁线程的时候,都不是我们程序关心的过程,程序关心的只是执行
  3. 有些业务程序不一定要串行执行,实际上可以并行去执行的;以节约相应时间
  4. 多个线程执行业务,那么怎么管理这些线程呢,是否可以统一管理

使用线程池的好处

  1. 充分利用CPU资源
  2. 提高相应时间
  3. 统一管理线程(比如线程优先级、监控等)

线程池工作原理

线程池,字面上理解肯定有一个池子,这个池子可以是集合或者队列等,java中使用的是队列;池子存在了,那么就需要工作者,就是真实的工作线程;真实的工作线程控制多少呢,真实的工作者的个数;这些都存在了,那么往池子中注入业务是否需要一个入口,java中就是submit

现实中例子:线程池好比一间客服办公室;办公室为池子;办公室必须保证n个接线员以上,n为核心线程数,工位数为最大线程数;接线员为真实的工作线程;电话号码(如10086)位线程池作业提交入口;超出的n个电话业务而等待的电话咨询数,为等待队列;如果等待的人数超出能等待的范围,就添加接线员到新的工位上,接电话;

线程池UML

线程池采用模板模式

线程池UML.png

ThreadPoolExecutor原理图

线程池原理.png
  1. 运行线程数小于 corePoolSize,则创建新的线程来执行(创建新的线程,需要获取全局锁,这时候,其它线程可能在创建或者销毁等)
  2. 如果运行线程数大于等于corePoolSize,则任何加入BlockingQueue
  3. 如果BlockingQueue已满,maximumPoolSize>corePoolSize,则创建新的线程来处理任务(创建线程需要获取全局锁)
  4. 如果队列满,且maximumPoolSize也满,则执行拒绝策略
public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

线程池提交任务

两种方式:

  1. execute() :提交不需要返回值的任务
  2. submit():提交需要返回值的任务,返回类型为Future<Object>

关闭线程池

shutdown,shutdownNow两种方式。原理都是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,无法响应中断的任务可能永远无法终止。

上一篇下一篇

猜你喜欢

热点阅读