码迷,mamicode.com
首页 > 编程语言 > 详细

6种线程池

时间:2019-10-04 13:04:50      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:nose   run   val   join   nano   ted   new   cti   内存耗尽   

虽然有6中线程池,但除了ForkJoinPool是实现了ExecutorService 其它的都是对ThreadPoolExecutor的调用。

1.FixedThreadPool

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

LinkedBlockingQueue,阻塞队列。传入的是Runnable
当线程池线程没有空闲时,任务就是阻塞

最普通的线程池,可以指定线程数大小。创建是线程是普通线程

2. SingleThreadPool

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

线程数为1的线程池,这样可以保证有序

3. CacheThreadPool

public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());//无参方法,默认最大线程数大小为Integer.MAX_VALUE
    }

SynchronousQueue同步队列
队列容量为0。传进来一个Runnable,就直接把Runnable交给一个线程。如果没有线程就会创建一个线程并立即执行。

没有大小限制的线程池(可以手动设置一个最大值),有新的运行任务时会创建一个临时线程,任务结束会保留一段时间(默认60s,可以自己设置)。如果不停的有任务,会把系统内存耗尽为止

4. ScheduledThreadPool

    public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {
        return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1, threadFactory));
    }        

ScheduledThreadPoolExecutor的构造方法

    public ScheduledThreadPoolExecutor(int corePoolSize,
                                       ThreadFactory threadFactory) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue(), threadFactory);//这里传入的是一个DelayWorkQueue 
    }

DelayedWorkQueue 延迟队列 就是添加了一个定时的属性

类似FixedThreadPool,区别在于 可以执行定时任务

5. WorkStealingThreadPool

ForkJoinThreadPool的封装,更加方便。创建的线程是守护线程。每个线程都有自己的任务队里,某个线程任务队列全部完成,就会去其它线程任务队列偷任务。

守护线程:jvm不退出,线程就不退出,即使主线程已经退出。

6. ForkJoinThreadPool

类似于多线程递归,将大的计算分为多个小计算并分配给多个线程。
分配的规则要自己编写,继承ForkJoinTask类,重新exec()方法。
一般的会继承RecursiveAction类,RecursiveTask类 ,重写compute(),这两个是继承于ForkJoinTask

6种线程池

标签:nose   run   val   join   nano   ted   new   cti   内存耗尽   

原文地址:https://www.cnblogs.com/duangL/p/11621729.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!