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 终止状态,线程中断或者运行结束的状态