0%

Java并发编程之线程池概述

使用线程池可以有以下优点:

  1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  2. 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  3. 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。

实现原理

线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。他的主要特点为:线程复用;控制最大并发数;管理线程

线程复用

每一个 Thread 的类都有一个 start 方法。 当调用 start 启动线程时 Java 虚拟机会调用该类的 run 方法。 那么该类的 run() 方法中就是调用了 Runnable 对象的 run() 方法。 我们可以继承重写 Thread 类,在其 start 方法中添加不断循环调用传递过来的 Runnable 对象。 这就是线程池的实现原理。循环方法中不断获取 Runnable 是用 Queue 实现的,在获取下一个 Runnable 之前可以是阻塞的。

线程池使用注意事项

配置合理线程池的参考项

  1. ❑ 任务的性质:CPU密集型任务、IO密集型任务和混合型任务。
    1. CPU密集型任务:配置可能小的线程,如配置Ncpu+1个线程的线程池。
    2. IO密集型任务:配置尽可能多的线程,如2*Ncpu。
  2. ❑ 任务的优先级:高、中和低。
    1. 使用优先级队列:PriorityBlockingQueue
  3. ❑ 任务的执行时间:长、中和短。
    1. 使用不同规模的线程池处理
    2. 或者使用优先级队列
  4. ❑ 任务的依赖性:是否依赖其他系统资源,如数据库连接。
    1. 线程数配置尽量大,充分利用CPU

使用技巧

  1. 避免是有无限队列

参考

  1. 《Java并发编程的艺术》
  2. 《Java并发编程》
  3. 《Java多线程编程核心技术》