线程池 落日映苍穹つ 2022-04-15 00:57 138阅读 0赞 ### 线程池的目的 ### > 降低资源消耗:通过重复利用已创建的线程降低线程创建和毁销的资源消耗。 > > 提高响应效率:当任务到达时,任务可以不需要等待线程创建就可以立即执行 > > 方便管理:线程是稀缺资源,如果无限制的创建线程,不仅会消耗系统资源,还会降低系统的稳定性 > > 线程池还可以进行统一分配、调优和监控:但是要做到合理利用线程池,必须对其实现原理了如指掌 > > 频繁的创建多线程,容易线程池溢出,非常占用CPU的内存 ### 线程池创建方式 ### > java.util.concurrent.Executors > > Java通过Executors(jdk1.5并发包)提供四种线程池,分别为: > > newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 > > newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 > > newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。 > > newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 ### 主要方法 ### > public ThreadPoolExecutor(int corePoolSize, > int maximumPoolSize, > long keepAliveTime, > TimeUnit unit, > BlockingQueue<Runnable> workQueue) \{ > this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, > Executors.defaultThreadFactory(), defaultHandler); > \} > > Executor框架的最顶层实现是ThreadPoolExecutor类,Executors工厂类中提供的newScheduledThreadPool、newFixedThreadPool、newCachedThreadPool方法其实也只是ThreadPoolExecutor的构造函数参数不同而已。通过传入不同的参数,就可以构造出适用于不同应用场景下的线程池,那么它的底层原理是怎样实现的呢,这篇就来介绍下ThreadPoolExecutor线程池的运行过程。 > > corePoolSize: 核心池的大小。 当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到 > > corePoolSize后,就会把到达的任务放到缓存队列当中(实际运行线程数) > > maximumPoolSize: 线程池最大线程数,它表示在线程池中最多能创建多少个线程(最大线程数) > > keepAliveTime: 表示线程没有任务执行时最多保持多久时间会终止(空闲超时时间) > > unit: 参数keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性 ### 合理配置线程池 ### **CPU密集** CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行。 CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程),而在单核CPU上,无论你开几个模拟的多线程,该任务都不可能得到加速,因为CPU总的运算能力就那些。 **IO密集** IO密集型,即该任务需要大量的IO,即大量的阻塞。在单线程上运行IO密集型的任务会导致浪费大量的CPU运算能力浪费在等待。所以在IO密集型任务中使用多线程可以大大的加速程序运行,即时在单核CPU上,这种加速主要就是利用了被浪费掉的阻塞时间。 CPU密集型时,任务可以少配置线程数,大概和机器的cpu核数相当,这样可以使得每个线程都在执行任务 IO密集型时,大部分线程都阻塞,故需要多配置线程数,2\*cpu核数 操作系统之名称解释: 某些进程花费了绝大多数时间在计算上,而其他则在等待I/O上花费了大多是时间, 前者称为计算密集型(CPU密集型)computer-bound,后者称为I/O密集型,I/O-bound。
相关 Java 线程池、Runnable线程池、Callable线程池 线程池: 其实就是一个容纳多个线程的容器,其中的线程可以反复的使用,省去了频繁创建和销毁过程对象的操作,无需反复创建线程面消耗过多资源。 为什么要用线程池: 合理 青旅半醒/ 2023年02月26日 12:30/ 0 赞/ 50 阅读
相关 线程、线程池 创建线程的3种方法: package com.frank.threadPool.createThread; / @author 小石潭记 布满荆棘的人生/ 2022年10月22日 04:27/ 0 赞/ 384 阅读
相关 线程池 1.所谓线程池,就是程序的初始化阶段,就预先创建一批线程,每个线程都做好准备干活; 2.然后有一个任务列表,一开始为空,当有任务来了,就往任务列表里面添加;这个任务列表 痛定思痛。/ 2022年06月13日 13:22/ 0 赞/ 328 阅读
相关 线程池 西施越溪女,明艳光云海 最近用线程池和不用线程池做了个速度的测试,在这里备注下: 结果是速度不相上下; public static void main(Str 妖狐艹你老母/ 2022年05月20日 02:35/ 0 赞/ 281 阅读
相关 线程池 线程池 Java里面线程池的顶级接口是 java.util.concurrent.Executor , 但是严格意义上讲 Executor并不是一个线程池,而只是一个 迈不过友情╰/ 2022年03月06日 14:34/ 0 赞/ 400 阅读
相关 线程池 线程池 > 从字面义上来讲,是指管理一组同构工作线程的资源池。线程池是与工作队列密切相关的,其中在工作队列中(Worker Queue)保存了所有等待执行的任务。工作者( 清疚/ 2021年12月11日 03:35/ 0 赞/ 388 阅读
相关 线程池 可preStart一个或全部core thread 0,小于core则来一个任务建一个线程(firstTask),队列,额外线程,拒绝 一个AtomicInteger的 今天药忘吃喽~/ 2021年11月23日 03:40/ 0 赞/ 411 阅读
相关 线程池 1、先创建线程池 import java.util.concurrent.ArrayBlockingQueue; import java.util.concu 拼搏现实的明天。/ 2021年11月09日 14:28/ 0 赞/ 421 阅读
还没有评论,来说两句吧...