7大参数:
1.corePoolSize:核心线程数,线程池创建好之后就准备就绪的线程数量,等待接受任务,不会回收,除非设置了allowCoreThreadTimeOut.
2.maximumPoolSize:最大线程数量,线程池中允许的最大线程数量,控制资源。
3.keepAliveTime:存活时间,如果当前线程数量大于核心线程数量。多出的线程等待一定时间后如果还是空闲着就释放。
4.unit:时间单位。
5.BlockingQueue<Runnable>:阻塞队列,如果任务有很多,就会将目前多的任务放在队列中,只要有线程空闲,就会去队列里面取出新的任务。
6.ThreadFactory:线程创建工厂。
7.RejectedExecutionHandler:如果队列中的任务满了,按照指定的拒绝策略拒绝执行任务。
工作顺序:
1.线程池创建,准备好corePoolSize数量的核心线程,准备接受任务
2.任务进来,用空闲的核心线程执行任务
1)、核心线程用完了,就将新任务放入阻塞队列中。空闲的核心线程就会自己去阻塞队列获取任务执行
2)、队列满了,就开新线程执行,最大只能开到maximumPoolSize数量的线程
3)、任务执行完毕后,新开的maximumPoolSize - corePoolSize数量的空闲线程会在keepAliveTime时间后自动释放,最终保持corePoolSize数量的线程。
4)、如果线程数达到最大线程数量,还有新任务进来,就会用RejectedExecutionHandler的拒绝策略来拒绝接受任务
3.所有的线程都是由指定的ThreadFactory来创建的
线程池类型:
1.newFixedThreadPool:这是一个线程数固定的,线程可以重用的线程池,用共享的无界队列方式运行这些线程。如果所有的核心线程都在忙,这时又有新的任务来,这个新的任务会去队列中等待。如果一个线程在半路突然中止了,那么会有一个新的线程代替它执行后续的任务。一个线程在被关闭之前,它会一直在线程池中等待被调用。
特征:
1.线程池中线程的量固定,可以控制线程的并发量。
2.线程可以被重复利用
3.任务数超出核心线程数时,那些额外的任务需要去队列中等待。如果队列中都挤满了,又有新的任务来,就会派额外的新线程去接客。如果达到了最大线程数后,还有新的任务来,那就直接抛异常。
2.newCachedThreadPool:它是根据需要,创建线程,没有核心线程,当60s内这个线程没接收到任务时,它就会被从池中收走。60s内这个线程又接收到新任务时,它就又被重用了。
特征:
1.线程池中线程的数量不固定,最大值是Integer的最大值
2.池中的线程干完活后会等待1分钟(默认的),如果1分钟内又有新任务,这个线程就被调用去干新任务了,如果等了1分钟还没有新任务,这个线程就被从池中清理出去了。
3.当池中没有可用线程时,就创建一个新线程。
3.newSingleThreadPool:这个线程池中只有1个线程,用无界队列的方式运行。如果这个线程突然挂掉了,线程池会新建一个新的线程顶替它,继续完成任务。
特征:池中只有1个线程,任务要在队列中排队。当需要保证任务执行顺序时,适合用它。
4.newScheduleThreadPool:创建一个线程池,可以让它里面的线程延迟执行,或在规定的时间后执行。
特征:
1.这个池中的线程,可以让它们延迟干活,或规定时间干活。
2.线程池中的线程数量固定,即使没有任务,这些线程也保留。
5.newWorkStealingPool:jdk1.8提供的线程池,底层使用ForkJoinPool实现,池中有多个任务队列。适用于任务多,可以并发执行的场景。
特征:池中有多个队列。