线程池:
jdk 1.8 新增newWorkStealingPool 线程池,适合非常耗时的场景
jdk 1.8 以前 的线程池newSingleThreadPool、newFixedThreadPool、newCachedThreadPool、newScheduledThreadPool
创建线程池
ExecutorService executorService = Executors.newSingleThreadExecutor();
用Executors 来创建
创建单核心的线程池
newSingleThreadExecutor()
创建一个无解队列的线程池,如果线程崩溃会重新创建一个,直到任务完成。
线程池参数:
corePoolSize : 表示线程池核心线程数,当初始化线程池时,会创建核心线程进入等待状态,即使它是空闲的,核心线程也不会被摧毁,从而降低了任务一来时要创建新线程的时间和性能开销。
maximumPoolSize : 表示最大线程数,意味着核心线程数都被用完了,那只能重新创建新的线程来执行任务,但是前提是不能超过最大线程数量,否则该任务只能进入阻塞队列进行排队等候,直到有线程空闲了,才能继续执行任务。
keepAliveTime : 表示线程存活时间,除了核心线程外,那些被新创建出来的线程可以存活多久。意味着,这些新的线程一但完成任务,而后面都是空闲状态时,就会在一定时间后被摧毁
unit : 存活时间单位,没什么好解释的,
workQueue : 表示任务的阻塞队列,由于任务可能会有很多,而线程就那么几个,所以那么还未被执行的任务就进入队列中排队,队列我们知道是 FIFO 的,等到线程空闲了,就以这种方式取出任务。这个一般不需要我们去实现。
newSingleThreadPool,为单核心线程池,最大线程也只有一个,这里的时间为 0 意味着无限的生命,就不会被摧毁了。
newSingleThreadPool 按照excute的顺序执行,是队列的形式,顺序执行的,串行的;
newFixedThreadPool,我们需要传入一个固定的核心线程数,并且核心线程数等于最大线程数,而且它们的线程数存活时间都是无限的,
newSingleThreadPool 是并行的,线程执行没有先后顺序,它的最大线程数等于核心线程数;
newCachedThreadPool,可以进行缓存的线程池,意味着它的线程数是最大的,无限的。但是核心线程数为 0,这没关系。这里要考虑线程的摧毁,因为不能够无限的创建新的线程,所以在一定时间内要摧毁空闲的线程,它是并行的;
newScheduledThreadPool,这个表示的是有计划性的线程池,就是在给定的延迟之后运行,或周期性地执行;
ScheduledExecutorService scheduledExecutorService=Executors.newScheduledThreadPool(2);
newWorkStealingPool 这个是 JDK1.8 版本加入的一种线程池,stealing 翻译为抢断、窃取的意思,它实现的一个线程池和上面4种都不一样,用的是 ForkJoinPool 类
它是一个并行的线程池,参数中传入的是一个线程并发的数量,这里和之前就有很明显的区别,前面4种线程池都有核心线程数、最大线程数等等,而这就使用了一个并发线程数解决问题,这个线程池不会保证任务的顺序执行,也就是 WorkStealing 的意思,抢占式的工作
来源:oschina
链接:https://my.oschina.net/u/3971821/blog/4303781