配置线程池
在我的项目有一个需求是导出报表中需要大量的IO操作,所以配置了2*NCPU的线程数量。
new ThreadPoolExecutor(corePoolSize, Runtime.getRuntime().availableProcessors() * 2, keepAliveTime,
milliseconds,runnableTaskQueue, handler);
要想合理地配置线程池,就必须首先分析任务特性,可以从以下几个角度来分析。
-
任务的性质:CPU密集型任务、IO密集型任务和混合型任务
-
任务的优先级:高中低
-
任务的执行时间:长中短
-
任务 的依赖性;是否依赖其他系统资源
CPU密集型任务应配置尽可能小的线程,如配置NCPU+1个线程的线程池,
IO密集型任务线程并不是一直在执行任务 ,则应配置尽可能多的线程,如2*NCPU 。
可以通过==Runtime.getRuntime().availableProcessors()==方法获得当前设备的CPU个数
优先级不同的任务可以使用优先级队列PriorityBlockingQueue来处理,它可以让优先级高的任务先执行。
监控线程池
在监控线程池的时候可以使用以下属性:
taskCount: 线程池需要执行的任务数量
completedTaskCount: 线程池在 运行过程中已完成的任务数量,小于或等于taskCount。
getPoolSize;线程池的线程数量,如果线程池不销毁的话,线程池里的线程不会自动销毁,所以这个大小只增不减
getActiveCount; 获取活动的线程数