本文共 1714 字,大约阅读时间需要 5 分钟。
java提供的线程池可以简化线程管理,提高线程资源的利用率。 大家好,我是李福春,今天的题目是: Java提供了哪些线程池?如何设置合适的线程池大小? 答:java.util.concurrent包中提供了5种线程池,从简单到复杂列举如下: 一,newSingleThreadExecutor() ,单线程池,任何时候工作线程都是1个,队列是无界队列保证任务的顺序执行; 二,newFixedThreadPool(int),固定数量的线程池,任何时候工作线程都是N,内部使用的无界队列; 三,newCachedThreadPool()缓存线程池,适合处理大量短时间执行的任务; 四,newWorkStealingPool(int)工作窃取线程池,java8引入,内部使用ForkJoinPool实现 五,newScheduledThreadPool(),适合处理定时或者周期性的任务 如何合理设置线程池大小? 需要综合计算任务的特点来。cpu耗费较高的,核心线程数一般设置为N(cpu核心数)等待任务较多的,核心线程数一般设置为 Ncpu利用率(1+平均等待时间/平均执行时间) 同时在使用线程池的时候,注意一下5点:1, 避免任务堆积2,避免过度扩展线程,以及避免线程泄露;3,避免死锁,合理使用各种锁;4,避免使用ThreadLocal;public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue2, newFixedThreadPool(int) ,工作队列是无界队列,超出极限容易引发内存溢出的问题;())); }
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); }
3, newCacheThreadPool(),最大线程数太大,容易引起线程泄露;
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue()); }
原创不易,转载请注明出处,让我们互通有无,共同进步,欢迎多沟通交流