接上文 下面是这三个静态方法的具体实现;
从它们的具体实现来看,它们实际上也是调用了ThreadPoolExecutor,只不过参数都已配置好了。 newFixedThreadPool创建的线程池corePoolSize和maximumPoolSize值是相等的,它使用的LinkedBlockingQueue; newSingleThreadExecutor将corePoolSize和maximumPoolSize都设置为1,也使用的LinkedBlockingQueue; newCachedThreadPool将corePoolSize设置为0,将maximumPoolSize设置为Integer.MAX_VALUE,使用的SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。 实际中,如果Executors提供的三个静态方法能满足要求,就尽量使用它提供的三个方法,因为自己去手动配置ThreadPoolExecutor的参数有点麻烦,要根据实际任务的类型和数量来进行配置。 另外,如果ThreadPoolExecutor达不到要求,可以自己继承ThreadPoolExecutor类进行重写。 四.如何合理配置线程池的大小本节来讨论一个比较重要的话题:如何合理配置线程池大小,仅供参考。 一般需要根据任务的类型来配置线程池大小: 如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU+1 如果是IO密集型任务,参考值可以设置为2*NCPU 当然,这只是一个参考值,具体的设置还需要根据实际情况进行调整,比如可以先将线程池大小设置为参考值,再观察任务运行情况和系统负载、资源利用率来进行适当调整。 参考资料: http:///java-threadpool/ http://blog.163.com/among_1985/blog/static/275005232012618849266/ http://developer.51cto.com/art/201203/321885.htm http://blog.csdn.net/java2000_wl/article/details/22097059 http://blog.csdn.net/cutesource/article/details/6061229 http://blog.csdn.net/xieyuooo/article/details/8718741 《JDK API 1.6》 |
|