几种常用的线程池

常用线程池
1、newSingleThreadExecutor
创建一个单线程化的线程池 , 它只会用唯一的工作线程来执行任务 , 保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行 。
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }2、newFixedThreadPool
创建一个定长线程池 , 可控制线程最大并发数 , 超出的线程会在队列中等待 。
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }3、newCachedThreadPool
创建一个可缓存线程池 , 如果线程池长度超过处理需要 , 可灵活回收空闲线程 , 若无可回收 , 则新建线程 。
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }4、newScheduledThreadPool
创建一个定长线程池 , 支持定时及周期性任务执行 。
【几种常用的线程池】public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); }Executors各个方法的弊端
newFixedThreadPool、newSingleThreadExecutor:
主要问题是堆积的请求处理队列可能会耗费非常大的内存 , 甚至OOM 。
newCachedThreadPool、newScheduledThreadPool:
主要问题是线程数最大数是Integer.MAX_VALUE , 可能会创建数量非常多的线程 , 甚至OOM 。
线程池的作用
1、提高效率 创建好一定数量的线程放在池中 , 等需要使用的时候就从池中拿一个 , 这要比需要的时候创建一个线程对象要快的多 。
2、方便管理 可以编写线程池管理代码对池中的线程同一进行管理 , 比如说启动时有该程序创建100个线程 , 每当有请求的时候 , 就分配一个线程去工作 , 如果刚好并发有101个请求 , 那多出的这一个请求可以排队等候 , 避免因无休止的创建线程导致系统崩溃 。




    推荐阅读