多 线 程

本文深入探讨了Java线程池的核心参数,如corePoolSize、maximumPoolSize、keepAliveTime及其单位,以及不同类型的阻塞队列。讲解了四种线程池的默认配置:CachedThreadPool、FixedThreadPool、ScheduledThreadPool和SingleThreadExecutor。此外,还阐述了线程的五种状态,包括NEW、RUNNABLE、BLOCKED、WAITING和TERMINATED。最后,提出了针对CPU密集型和IO密集型任务的线程池配置建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、线程池

1、corePoolSize:线程池中的常驻核心线程数

2、maximumPoolSize:最大线程数

3、keepAlive:多余的空闲线程的存活时间

4、unit:keepAlive的单位

5、workQueue:任务队列,被提交但尚未被执行的任务存放在任务队列中

SynchronousQueue:[ˈsɪŋkrənəs] 接收到任务的时候,会直接提交给线程处理,而不保留它

LinkedBlockingQueue:不可设置长度,默认长度为Integer.MAX_VALUE

ArrayBlockingQueue:可以限定队列的长度

DelayQueue:队列内元素必须实现Delayed接口,这就意味着你传进去的任务必须先实现Delayed接口。这个队列接收到任务时,首先先入队,只有达到了指定的延时时间,才会执行任务

6、treadFactory:线程工厂,使用默认

7、handler:拒接策略,任务队列满了,且工作线程等于线程池的最大线程数时,又来了一个任务。AbortPolicy,DiscardPolicy,DiscardOldestPolicy,CallerRunsPolicy

ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。 
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务 
ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务

CPU密集型:CPU核数 + 1个线程数;IO密集型:CPU核数 / (1 - 阻塞系数) 阻塞系数在0.8 ~ 0.9左右,例如:8核CPU:8/ (1 - 0.9) = 80个线程数

CachedThreadPool:   0,  Integer.MAX_VALUE,  SynchronousQueue

FixedThreadPool:     x,          x,         LinkedBlockingQueue

ScheduledThreadPool: x,  Integer.MAX_VALUE,  DelayedWorkQueue

SingleThreadExecutor: 1,          1,         LinkedBlockingQueue

二、线程状态

NEW 新建状态,线程创建且没有执行start方法时的状态

RUNNABLE 可运行状态,线程已经启动,但是等待相应的资源(比如IO或者时间片切换)才能开始执行

BLOCKED 阻塞状态,当遇到synchronized或者lock且没有取得相应的锁,就会进入这个状态

WAITING 等待状态,当调用Object.wait或者Thread.join()且没有设置时间,在或者LockSupport.park时,都会进入等待状态。

TIMED_WAITING 计时等待,当调用Thread.sleep()或者Object.wait(xx)或者Thread.join(xx)或者LockSupport.parkNanos或者LockSupport.partUntil时,进入该状态

TERMINATED 终止状态,线程中断或者运行结束的状态
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值