java并发编程的艺术第九章——java中的线程池

2017-08-26  本文已影响36人  会跳舞的机器人

1、线程池的三个好处:

2、线程池的处理流程

新任务提交至线程池后的处理流程:

3、线程池的使用

3.1、线程池的创建
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
3.2、向线程池提交任务

提交任务有两种方法,分别是execute()和submit()。

execute()方法适用于任务提交之后没有返回值的这种情况,因为没有返回值,所以提交任务之后我们也无法判断任务是否执行成功。

submit方法适用于提交任务之后有返回值的情况,它会返回一个Future类型的对象,可以通过future.get()方法来获取返回值,get()会阻塞线程直到任务完成。

3.3、关闭线程池

关闭线程池有两种方法,分别是shutdown()和shutdownNow(),它们的原理都是遍历线程池中所有的线程,分别调用每个线程池的interrupt()方法来中断线程。但是它们存在一定的区别,shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。

3.4、合理的配置线程池

线程池配置的分析角度

线程池的任务队列的选择建议使用有界队列,因为如果任务太多,有界队列可以抛出异常便于我们排查,而无界队列会使队列中的任务越来越多,可能导致撑满内存,导致整个系统的不可用。

3.5、线程池的监控

上一篇 下一篇

猜你喜欢

热点阅读