第9章Java中的线程池
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或者并发执行的程序都可以使用线程池。在开发过程中,合理使用线程池能够带来3个好处。
第一:降低资源消耗
第二:提高响应速度
第三:提高线程的可管理性
9.1 线程池的实现原理
线程池的主要处理流程,处理流程图如图9-1所示
1)线程池判断核心线程池的线程是否都在执行任务,不是则则创建线程执行任务。如果都在执行任务,则进入下一个流程
2)判断工作队列满了吗。若没有则加入到队列中,否则进入下个流程
3)线程池是否处于工作状态,满了交给饱和策略来执行这个任务。
源码分析:
9.2线程池的使用
9.2.1线程池的创建
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,milliseconds,runnableTaskQueue, handler);
9.2.2向线程池提交任务
可以使用两个方法向线程池提交任务,分别未execute()和submit()方法
execute()方法用于提交不需要返回值的任务,所以无法判断是否被线程池执行成功。
submit()方法用于提交需要返回值的任务。线程池返回一个future类型的对象,通过future对象可以判断任务是否执行成功,并且可以通过future的get()方法获取返回值,会一直阻塞直到任务完成,而使用get(long timeout,TimeUnit unit)方法则会一直阻塞线程到达一定时间立即返回
9.2.3线程池的关闭
shutdown shutdownNow
9.2.4 合理配置线程池