四种线程池分别都有哪些原理?要怎么实现?

TheDisguiser 2020-05-25 21:04:30 java常见问答 5002

在java中,有着四种线程池,你们知道它们分别是怎么实现的吗?它们的原理又有哪些呢?下面快来看看吧。

一、 newCachedThreadPool

原理

newCachedThreadPool,这是一种线程数量不定的线程池,newCachedThreadPool的最大线程数是Integer.MAX_VALUE,这是一个非常大的数。

newCachedThreadPool是一个可缓存线程池,假如,线程池长度超过处理需要,那么就会回收空闲线程,假如没有可以回收线程,那么,就会新建线程。

可是,在线程池中的空闲线程都是有时间限制的,时长是60秒,超过60秒闲置线程,那么就会被回收。

调用execute将重用以前构造的线程(假如线程可用)。

这样的线程池比较适合执行大量的耗时较少的任务,在整个线程池都处在闲置状态的时候,线程池当中的线程都会超时被停止。

具体实现

public static ExecutorService newCachedThreadPool()
{
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE
        , 60 L, TimeUnit.SECONDS
        , new SynchronousQueue < Runnable > ());
}

二、newFixedThreadPool

原理

newFixedThreadPool创建的是一个指定工作线程数量的线程池,每次在它提交一个任务的时候,就会创建一个工作线程,在线程处在空闲状态的时候,它们不会被回收,除非是线程池关闭,可是,假如工作线程的数量达到线程池初始的最大数了话,那么,它就会将提交的任务存入到池队列当中。

newFixedThreadPool只有核心线程,并且,这些核心线程都不会被回收,所以它才能够更加快速底相应外界的请求。

具体实现

public static ExecutorService newFixedThreadPool(int nThreads)
{
    return new ThreadPoolExecutor(nThreads, nThreads
        , 0 L, TimeUnit.MILLISECONDS
        , new LinkedBlockingQueue < Runnable > ());
}

三、 newScheduledThreadPool

原理

newScheduledThreadPool是一个定长线程池,newScheduledThreadPool的核心线程数量是固定的,并且,是没有限制的,除此之外,当非核心线程处于闲置的时候,会立马被回收,它会安排给定延迟后运行命令或者是定期地执行。

具体实现

public static ScheduledExecutorService newScheduledThreadPool(
    int corePoolSize, ThreadFactory threadFactory)
{
    return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}

四、newSingleThreadExecutor

原理

newSingleThreadExecutor线程池是一个单线程化线程池,newSingleThreadExecutor内部只有一个核心线程,会以无界队列方式来执行这个线程,使得这些任务之间不需要处理线程同步的问题,它会确保所有的任务都在同一个线程里面依照顺序中执行,并且可以在任意给定的时间不会有多个线程是活动的。

具体实现

public static ExecutorService newSingleThreadExecutor()
{
    return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1
        , 0 L, TimeUnit.MILLISECONDS
        , new LinkedBlockingQueue < Runnable > ()));
}

以上就是本文的所有内容了,还想要深入了解更多有关线程池的java常见问答知识的话,就请持续关注我们的网站吧。

推荐阅读:

创建线程池该如何创建?有几种方式?

java线程池的作用是什么?线程池介绍

线程池的核心参数有哪些?分别代表什么?