首页 > 编程知识 正文

线程池原理核心,线程池原理参数

时间:2023-05-04 12:30:43 阅读:226090 作者:3133

线程池原理 为什么要用线程池线程池原理—概念线程池API——接口定义和实现类方法定义线程池API——Executors工具类线程池原理——任务execute过程同步队列(SynchronousQueue):线程池中止shutdownshutdownNow 线程数量

为什么要用线程池

线程是不是越多越好?
1、线程在java中是一个对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间+销毁时间>执行任务时间,就很不合算。
2、java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小1M,这个栈空间是需要从系统内存中分配的。线程过多,会消耗很多的内存。
3、操作系统需要频繁切换线程上下文(大家都想被运行),影响性能。
线程池的推荐,就是为了方便的控制线程数量。

线程池原理—概念

1、线程池管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;
2、工作线程:线程池中线程,在没有任务时,处于等待状态,可以循环的执行任务;
3、任务接口:每个任务必须实现的接口,以供工作线程调度任务的执行。它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
4、任务队列:用于存放没有处理的任务。提供一种缓冲机制;

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

方法定义


线程池API——Executors工具类

可以自己实例化线程池,也可以用Executors创建线程池的工厂类,常用方法如下:

newFixedThreadPool(int nThreads):创建一个固定大小、任务队列容量无界的线程池。核心线程数=最大线程数。

newCachedThreadPool():创建一个大小无界的缓冲线程池。它的任务队列是一个同步队列。任务加入到池中,如果池中有空闲线程,则用空闲线程执行;如无空闲线程,则创建新线程执行。池中的线程空闲超过60s,将被销毁释放。线程数随任务的多少变化。适用于执行耗时较小的异步任务。池的核心线程数=0,最大线程数=Integer.MAX_VALUE。

newSingleThreadExecutor():只有一个线程来执行无界任务队列的单一线程池。该线程池确保任务按加入的顺序一个一个一次执行。当唯一的线程因任务异常中止时,将创建一个新的线程来继续执行后续的任务。与newFixedThreadPool(1)的区别在于:单一线程池的池大小在newSingleThreadExecutor方法中硬编码,不能再改变。

newScheduledThreadPool(int corePoolSize):能定时执行任务的线程池。该池的核心线程数由参数指定,最大线程数=Integer.MAX_VALUE。

线程池原理——任务execute过程

1、是否达到核心线程数量?没达到,创建一个工作线程来执行任务。
2、工作队列是否已满?没满,则将新提交的任务存储在工作队列中。
3、是否达到线程池最大数量?没达到,则创建一个新的工作线程来执行工作。
4、最后,执行拒绝策略来处理这个任务。

同步队列(SynchronousQueue):

      SynchronousQueue,实际上它不是一个真正的队列,因为它不会为队列中元素维护存储空间。
      与其他队列不同的是,它维护一组线程,这些线程在等待着把元素加入或移出队列。
      在使用SynchronousQueue作为工作队列的前提下,客户端代码向线程池提交任务时,而线程池中又没有空闲的线程能够从SynchronousQueue队列实例中取一个任务,那么相应的offer方法调用就会失败(即任务没有被存入工作队列)。
      此时,ThreadPoolExecutor会新建一个新的工作者线程用于对这个入队列失败的任务进行处理(假设此时线程池的大小还未达到其最大线程池大小maximumPoolSize)。

定时任务的本质就是:延时队列

线程池中止 shutdown

结果分析
1、 10个任务被执行,3个任务进入队列等待,2个任务被拒绝执行
2、调用shutdown后,不接收新的任务,等待13任务执行结束
3、 追加的任务在线程池关闭后,无法再提交,会被拒绝执行

shutdownNow

结果分析
1、 10个任务被执行,3个任务进入队列等待,2个任务被拒绝执行
2、调用shutdownnow后,队列中的3个线程不再执行,10个线程被终止
3、 追加的任务在线程池关闭后,无法再提交,会被拒绝执行

线程数量

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

计算型任务(纯内存操作,占用大量CPU,CPU密集型):cpu数量的1-2倍
      例子:8核,线程数量16

io型任务(网络,文件,数据库操作):想对比计算型任务,需要多一些线程,并发执行,要根据具体的IO阻塞时长进行考量决定。
如tomcat中默认的最大线程数为:200。

也可考虑根据需要在一个最小数量和最大数量间自动增减线程数。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。