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/
网友评论