线程池工厂类

x33g5p2x  于2022-02-07 转载在 其他  
字(2.3k)|赞(0)|评价(0)|浏览(213)

前言: Java提供的 Executor 都在JUC (java.util.concurrent) 包下面,主要包括:线程池工厂类Executors,线程池实现类ThreadPoolExecutor等

线程池 ThreadPoolExecutor 通常都是通过 Executors 来创建的

// 返回一个可根据实际情况调整线程个数的线程池
Executors.newCachedThreadPool();

// 创建一个固定数量的线程池
Executors.newFixedThreadPool(10);

// 创建一个线程数量为1的线程池
Executors.newSingleThreadExecutor();

// 返回一个ScheduledExecutorService对象
//该对象也是调用父类的线程池方法,类似newFixedThreadPool
Executors.newScheduledThreadPool(5);

Executors.newCachedThreadPool( )
创建一个数目无上限,但是线程不会轻易销毁的线程池
初始情况下,线程池里没有线程,随着注册任务进去,就会创建一些线程来处理任务,任务完成之后,线程不会立刻销毁,而是仍然存在等待执行新的任务
若有任务则没线程时则创建线程,每个线程空闲等待时间为60秒,60秒后如果该线程没有任务可执行,则被回收;(核心线程数量为0,最大线程数量为最大,空闲等待时间为60s)

源码:

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

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

Executors.newFixedThreadPool(10)
创建一个固定大小的线程池 (线程数目是固定的),不管任务再怎么多,线程数目也不会新增,任务就会在阻塞队列中排队 (工作中最主要使用的线程池)
当有任务提交时,若线程池中有空闲线程,则立即执行,若没有,则会被缓存在一个任务队列中等待有空闲的线程再去执行;(核心线程数等于最大线程数,默认空闲时间为0,空闲立马销毁)

源码:

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

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

Executors.newSingleThreadExecutor( )
创建一个线程数量为1的线程池
若空闲则执行,否则入队列等待被执行;(核心线程数量为1,最大线程数量也为1,空闲等待时间为0)

源码:
该方法有2个实现,一个带自定义的线程工厂,一个不带

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

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

Executors.newScheduledThreadPool(5)
和定时器的效果类似

源码:

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

相关文章