up:: 线程池拒绝任务的两个时机和四种策略简介
说明:
(1) 本篇博客的主要内容,简单介绍ThreadPoolExecutor提供的钩子方法;ThreadPoolExecutor提供了三个钩子方法,本篇博客仅仅演示了beforeExecute()方法;
(2) 声明:
● 并发(包括线程)中的内容,还是比较多的;本专栏介绍多线程,只能算是一个入门;
● 所以,本篇博客,如果做到,知道ThreadPoolExecutor有钩子方法这个东西,就足够了;
一:演示;
1.自定义一个线程池类:PauseableThreadPoolTest;
说明:
(1) ThreadPoolExecutor类是普通的、创建线程池的类;我们自定义的这个线程池类,继承了ThreadPoolExecutor类;
(2) 内容说明;
(3) 这儿为了保证资源在多线程中的安全,使用到了ReentrantLock和Condition;对于这些锁相关的内容,可以暂时不深究;以后,自己系统学习并发的内容的时候,自然会了解;
(4) 其实,这儿的beforeExecute()方法,这就是ThreadPoolExecutor提供的三个钩子方法之一;这也是,本篇博客主要的目的;
● ThreadPoolExecutor提供了三个钩子方法,可以在任务执行前后或者终止时做一些额外的操作。
● 这三个钩子方法是:beforeExecute():线程池执行某个任务前会调用,afterExecute():任务结束后(任务异常退出)会执行,terminated():线程池执行结束后执行;
● 而,本篇博客演示的就是beforeExecute();
● 在实际开中,对于线程池,我们就可以利用钩子方法,在每个任务执行前或执行后,做一些事情;比如,日志、统计等;
● 其实,这很容易就能联想到过滤器、拦截器、AOP;虽然线程池的钩子方法和上面是三个不是一种东西,但是其中的思想能感受到有点相通;
2.创建PauseableThreadPoolTestTest类,创建线程池,去演示;
说明:
(1) 内容说明;
● 有匿名内部类,如有需要可以参考Java多态;
(2) 看注释吧;
(3) 运行结果;