【并发学习二】ThreadPoolExecutor

Java线程池

三大好处:

1.降低资源消耗;2.提高响应速度;3.提高线程的可管理性;

ThreadPoolExecutor:

new ThreadPoolExecutor (

corePoolSize,        //线程池基本大小

maximumPoolSize,     //线程池最大大小

keepAliveTime,        //线程活动保持时间

timeUnit,        //时间单位

runnableTaskQueue,   //任务队列,可选ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue,PriorityBlockingQueue。建议使用有界队列,增加系统稳定性和预警能力。无界队列可能引起内存撑爆,影响其他应用。

threadFactory,   //创建线程的工厂

 handler);      //饱和策略,有:CallerRunsPolicy,DiscardOldestPolicy,DiscardPolicy,或者自定义实现。

向线程池提交任务:

1.execute(),输入一个Runnable,无返回值;

2.submit(),返回一个Future,通过future的get方法阻塞直到任务完成;

合理配置线程池:

1.根据任务性质:

           CPU密集型:配置尽可能少的线程数,一般Ncpu+1个;

           IO密集型:尽可能多配置线程数,如2*Ncpu个;

           混合型:能拆分尽量拆分。

(ps:通过Runtime.getRuntime().availableProcessors()方法获得当前设备的CPU数)

2.根据任务优先级:  可以用PriorityBlockingQueue来处理。

3.根据任务执行时间:  交给不同规模线程池处理,或者采用优先级队列。

4.其他资源(如数据库)的依赖性:如提交sql后等待数据库返回结果时间较长,则可以设置较大的线程数;

线程池的监控

几个常用参数:

taskCount    需要执行任务数;

completedTaskCount    已完成任务数;

largestPoolSize     曾经创建过的最大线程数;

getPoolSize      线程池中线程数量;

getActiveCount    获取活动的线程数;



参考资料:

1. 《Java线程池的分析和使用》  并发编程网 http://ifeve.com/java-threadpool/

你可能感兴趣的:(【并发学习二】ThreadPoolExecutor)