线程池终止和构建线程池

线程池终止

优雅行退出

shutdown() 如果调用了shutdown方法,则线程池处理SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕

强迫行退出

shutdownNow() 如果调用了shutdownNow()方法 则线程池处于STOP状态,此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务。

为什么不建议使用Executors构建线程池

Executors提供的很多默认的使用的都是*的LInkedBlockingQueue,在高负载技术场景下,*队列很容易导致OOM(OutOfMemory ,内存溢出)。因此,强烈建议使用有界队列

	//Executors 类中 线程池构造方法 大部分都是LinkedBlockingQueue *队列
	public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue *队列<Runnable>());
    }

	 public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    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静态工厂构建线程池

FixedThreadPool和SingleThreadPool

允许的请求队列(底层实现是LinkedBlockingQueue) 长度为Integer.MAX_VALUE ,可能会堆积大量的请求 导致 OOM

CachedThreadPool和ScheduledThreadPool

允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,导致OOM

避免使用Executors创建线程池,主要是避免使用其中的默认实现,我们可以自己直接调用ThreadPoolExecutor的构造函数来自己创建线程池。在创建的同时,给BlockQueue指定容量就可以了

上一篇:Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析


下一篇:【并发编程】如何选择适合的阻塞队列