java ThreadPoolExecutor处理线程执行器中被拒绝的任务

是什么?为什么?怎么做?

 

一、是什么

1.线程执行器的结束

想要结束线程执行器的时候,可以调用shutdown方法让线程执行器结束。

但是,如果存在正在运行的任务或者等待执行的任务,线程执行器不会马上结束。要等到所有任务都执行完毕,线程执行器才会结束。

运行结果:

2.任务被拒绝

如果在调用shutdown方法到执行器结束这个时间段中发送一个任务给线程执行器,这个任务会被拒绝(线程执行器即将关闭,不再接受任务)。

运行结果:

executorService直接报出拒绝任务的错误,scheduledExecutorService虽然没有报出错误,但是也拒绝执行延时任务(scheduledExecutorService没有拒绝服务的处理机制)。

那么被拒绝的任务应该如何处理呢?对此,ThreadPoolExecutor类提供了一套机制,当任务被拒绝时,就会调用这套机制对其进行处理。

二、为什么

任务不能提前预知线程执行器的结束。

如果任务非常重要,却又被线程执行器拒绝从而不能进行任何处理,可能会导致工作不能完成/出现不可预知的错误。

因此,有必要建立一套机制处理被线程执行器拒绝的任务。

三、怎么做

1.简单例子

 

这里的重点就是setRejectedExecutionHandler方法,这是ThreadPoolExecutor类提供的方法,为了使用此方法,必须把线程执行器强转为ThreadPoolExecutor:

之后,我们自己实现一个拒绝任务处理类,实现RejectedExecutionHandler接口:

这样就可以对线程执行器拒绝的服务进行处理了。

运行结果:

2.复杂一点的例子

修改一下拒绝任务处理类,执行被拒绝的任务:

运行结果:

这就保证了所有任务都能被执行。

四、总结

平时似乎很少有使用的机会…

发表评论

电子邮件地址不会被公开。 必填项已用*标注