线程池原理分析
@ 线程池原理分析
对于线程的理解
线程是一条流,是代码执行流,完成一组代码的执行(例如,进行某个函数的实现)。
而这一组代码,可称为任务。
为什么要用多线程?
提高对cpu资源的利用,并发执行任务。
单核cpu,是否适合多线程?
适合,如果是单线程,线程中需要等待Io时(等待磁盘数据或网络传输数据),cpu就空闲
了。
线程什么时候才会让出 cpu?
阻塞: wait await 等待IO
睡眠: sleep
yield: 主动让出
任务执行结束
cpu 作用
代码是指令,cpu 执行代码,指令进行传输需要一个寄托-线程。
多线程这么好,那是不是越多越好?
不是,原因有三:
线程多了之后,
1.耗时间-在java中每一个线程就是一个Thread对象,每一个线程都需要操作系统线程支
持,线程创建时间和销毁需要时间,如果线程创建时间+销毁需要时间>执行时间,不
合算。
2.耗内存-假如,同时很多个线程进行中(活的),那占用的(存放对象的内存)堆内存就
越多,相对应的操作系统线程占的系统内存越多,根据jvm 规范,一个线程默认
栈大小最大为1M,栈空间需要从系统内存分配。
3.影响性能-操作系统需要频繁切换上下文,因为每个线程都想执行。
创建多线程线程代码例:
jvm内存优化
-Xmx 100M 代表最大堆内存空间为 100M,如果同时运用的线程过多,容易导致堆空间
(oom)溢出。这时需要调大堆空间,但不能过大,如果调的过大,会导致系统内存相对变少
,使其吞吐力变差。
到底如何正确运用多线程呢?
目的:充分利用cpu,并发执行任务
本质:将代码运送给cpu 执行
用合适数量的线程,完成代码的运送,这个合适数量的线程就构成了一个池,
有任务要执行,就把它放入池中,池中的一个线程会把它运送到cpu执行。
对于线程池工作原理的理解
1.接收任务,任务被存储在任务仓库(BlockingQueue,阻塞队列,线程安全)中。
2.任务仓库中有任务时,工作线程从仓库取任务,执行。
3.任务仓库中没有任务时,线程处于阻塞状态,有任务时,**线程。
如何确定合适数量的线程
如果是计算型的任务,数量为cpu的1~2倍。
如果是IO型任务,因为IO会阻塞,默认最大200,一般为cpu数量的30~40倍,也可根据需要
在最大和最小之间自动加减线程数。