线程池

1. 线程池原理

线程池做的工作主要是控制运行的线程的数量

将任务放入队列,在线程创建后启动这些任务。

如果线程数量超过了大数量超出数量的线程排队等候,等其它线程执行完毕, 再从队列中取出任务来执行。他的主要特点为:线程复用;控制大并发数;管理线程。

线程池的主要功能和原理就是线程的复用

2. 线程复用

每一个 Thread 的类都有一个 start 方法。

当调用start启动线程时Java虚拟机会调用该类的 run 方法

那么该类的 run() 方法中就是调用了 Runnable 对象的 run() 方法。

我们可以继承重写 Thread 类在其 start 方法中添加不断循环调用传递过来的 Runnable 对象。 这就是线程池的实现原理。

循环方法中不断获取 Runnable 是用 Queue 实现的,在获取下一个 Runnable 之前可以是阻塞的。

3. 线程池的组成

一般由四个部分组成

  1. 线程池管理器:用于创建并管理线程池
  2. 工作线程:线程池中的线程
  3. 任务接口:每个任务必须实现的接口,用于工作线程调度其运行
  4. 任务队列:用于存放待处理的任务,提供一种缓冲机制 Java

4. 拒绝策略

线程池中的线程已经用完了,无法继续为新任务服务,同时,等待队列也已经排满了,再也塞不下新任务了。

这时候我们就需要拒绝策略机制合理的处理这个问题。

JDK内置拒绝策略如下:

  1. AbortPolicy : 直接抛出异常,阻止系统正常运行
  2. CallerRunsPolicy : 只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的 任务。显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能会急剧下降。
  3. DiscardOldestPolicy : 丢弃老的一个请求,也就是即将被执行的一个任务,并尝试再 次提交当前任务。
  4. DiscardPolicy : 该策略默默地丢弃无法处理的任务,不予任何处理。如果允许任务丢 失,这是好的一种方案


醉后不知天在水,满船清梦压星河