线程池种类<br>
Executors.newFixedThreadPool(int)固定数量线程池
Executors.newSingleThreadExecutor()单一化线程池
Executors.newCachedThreadPool()可缓存线程池<br>
Executors.newWorkStealingPool(int)
Executor.newScheduledThreadPool()<br>
7大参数
1.corePoolSize:线程池中常驻核心线程数<br>
2.maximumPoolSize:线程池能够容纳同时执行的最大线程数。<br>
3.keepAliveTime:多余的空闲线程的存活时间。<br>
4.unit:keepAliveTime的单位<br>
5.workQueue:任务队列,被提交但尚未被执行的任务<br>
6.threadFactory:生成线程池中工作线程的线程工厂
7.handler:拒绝策略。<br>
AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行<br>
CallerRunsPolicy:调用者运行,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退给调用者,从而降低新任务的流量<br>
DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务
DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案
自定义线程池
为什么不使用已有的线程池
LinkedBlockingQueue:由链表结构组成的有界(大小默认值为Integer.MAX_VALUE)阻塞队列
maxinumPoolSize为Integer.MAX_VALUE。创建大量线程
线程的生命周期
新创建了一个线程对象。新建状态
调用了该对象的start()方法。就绪状态
获得了cpu 执行。运行状态
阻塞状态
调用wait方法后。等待阻塞
运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。同步阻塞
运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时。其他阻塞
运行完run方法,或报异常。死亡状态