JAVA高性能编程专题-线程池应用及实现原理剖析

【主题】

线程池应用及实现原理剖析

【信息】

为什么要用线程池

线程是不是越多越好?

1、线程在java中是一个对象,操作系统的资源,创建、销毁需要时间。如果创建时间+销毁时间>执行时间不划算

2、java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小1M,这个栈空间是从系统内存中分配的。

3、操作系统需要频繁切换线程上下文,影响性能。

线程池原理 - 概念

  • 线程池管理器
  • 工作线程
  • 任务接口
  • 任务队列

线程池API——接口定义和实现类

接口:

  • Executor
  • ExecutorService
  • ScheduleExcutorService

实现类:

  • ThreadPoolExecutor
  • ScheduledThreadPoolExecutor

线程池API-方法定义

JAVA高性能编程专题-线程池应用及实现原理剖析_第1张图片

ScheduleExecutorService

JAVA高性能编程专题-线程池应用及实现原理剖析_第2张图片

线程池API-Executors工具类

  • newFixedThreadPoll(int nThreads)
  • newCachedThreadPoll()
  • newSingleThreadExecutor()
  • newScheduledThreadPoll(int corePoolSize)

线程池原理-任务execute过程

JAVA高性能编程专题-线程池应用及实现原理剖析_第3张图片

线程数量

如何确定合适数量的线程?

  • 计算型任务:cpu数量的1-2倍
  • IO型任务:相比计算型任务,需多一些线程,要根据具体的IO阻塞时长进行考量决定。如tomcat中默认的最大线程数为:200。也可考量根据需要在一个最小数量和最大数量间自动增减线程数。

有个小窍门:监控CPU的情况,CPU的利用率达到80%,达到充分利用。如果太满的话,证明线程池数量可能太多了,CPU处理不过来;如果太少,就没有合理地利用到。

【思考】

线程池的线程计算方式?

【行动/反馈】

  • Executor线程池的最佳线程数量计算
  • 并发下线程池的最佳数量计算
  • 并发下线程池的最佳数量计算
  • 如何估算吞吐量以及线程池大小

【钩子】

线程池

你可能感兴趣的:(java)