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

【主题】

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

【信息】

为什么要用线程池

线程是不是越多越好?

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

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

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

线程池原理 - 概念

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

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

接口:

  • Executor
  • ExecutorService
  • ScheduleExcutorService

实现类:

  • ThreadPoolExecutor
  • ScheduledThreadPoolExecutor

线程池API-方法定义

线程池API-方法定义.png

ScheduleExecutorService

ScheduleExecutorService.png

线程池API-Executors工具类

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

线程池原理-任务execute过程

任务execute过程.png

线程数量

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

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

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

【思考】

线程池的线程计算方式?

【行动/反馈】

【钩子】

线程池

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值