可以看到newWorkStealingPool执行时根据cpu核心分配线程数量,这里打印显示cpu核心数为4,明显的可以看出线程将前4 个任务扔给了1-4号线程,后四个任务在排队等待。当1-4号线程中某个线程最先执行完毕后
会自动窃取未执行的任务,这里可以看到1号线程最先执行完毕用时1000ms,然后就窃取第五个任务。第0号线程执行完毕后,又紧接着执行第六个任务....。依次类推,直到所有任务执行完毕。
四、线程池的使用建议建议根据自己的需要手动创建线程池(new ThreadPoolExecutor(......)),这样可以灵活使用线程池,并且可可以加深自己对线程池的理解。阿里巴巴开发手册和Dubbo线程池的开发手册也是这样建议
Dubbo线程池的开发手册如下
阿里巴巴开发手册建议如下
我们可以看一下Dubbo怎么创建线程池的
@SPI("fixed") public interface ThreadPool { /** * 线程池 * * @param url 线程参数 * @return 线程池 */ @Adaptive({Constants.THREADPOOL_KEY}) Executor getExecutor(URL url); } public class FixedThreadPool implements ThreadPool { public Executor getExecutor(URL url) { String name = url.getParameter(Constants.THREAD_NAME_KEY, Constants.DEFAULT_THREAD_NAME); int threads = url.getParameter(Constants.THREADS_KEY, Constants.DEFAULT_THREADS); int queues = url.getParameter(Constants.QUEUES_KEY, Constants.DEFAULT_QUEUES); return new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS, queues == 0 ? new SynchronousQueue<Runnable>() : (queues < 0 ? new LinkedBlockingQueue<Runnable>() : new LinkedBlockingQueue<Runnable>(queues)), new NamedThreadFactory(name, true), new AbortPolicyWithReport(name, url)); } }
默认情况下,Dubbo的FixedThreadPool中,maximumPoolSize = 200,队列是容量很小的SynchronousQueue.所以当线程超过200的时候,线程池就会抛出异常.
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx