线程池原理分析

@ 线程池原理分析

对于线程的理解

线程是一条流,是代码执行流,完成一组代码的执行(例如,进行某个函数的实现)。

而这一组代码,可称为任务。

为什么要用多线程?

提高对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倍,也可根据需要

在最大和最小之间自动加减线程数。