线程池之拒绝策略

池子有对象池如commons pool的GenericObjectPool(通用对象池技术)也有java里面的线程池ThreadPoolExecutor,但java里面的线程池引入了一个叫拒绝执行的策略模式,感觉比GenericObjectPool好一点,意思也就是说当池子满的时候该如何执行还在不断往里面添加的一些任务。


像GenericObjectPool只提供了,继续等待和直接返回空的策略。而ThreadPoolExecutor则提供了一个接口,并内置了4中实现策略供用户分场景使用。


ThreadPoolExecutor.execute(Runnable command)提供了提交任务的入口,此方法会自动判断如果池子满了的话,则会调用拒绝策略来执行此任务,接口为RejectedExecutionHandler,内置的4中策略分别为AbortPolicy、DiscardPolicy、DiscardOldestPolicy、CallerRunsPolicy。
线程池之拒绝策略_第1张图片

AbortPolicy

为java线程池默认的阻塞策略,不执行此任务,而且直接抛出一个运行时异常,切记ThreadPoolExecutor.execute需要try catch,否则程序会直接退出。


DiscardPolicy

直接抛弃,任务不执行,空方法


DiscardOldestPolicy

从队列里面抛弃head的一个任务,并再次execute 此task。


CallerRunsPolicy

在调用execute的线程里面执行此command,会阻塞入口


用户自定义拒绝策略

实现RejectedExecutionHandler,并自己定义策略模式


再次需要注意的是,ThreadPoolExecutor.submit() 函数,此方法内部调用的execute方法,并把execute执行完后的结果给返回,但如果任务并没有执行的话(被拒绝了),则submit返回的future.get()会一直等到。


future 内部其实还是一个runnable,并把command给封装了下,当command执行完后,future会返回一个值。



你可能感兴趣的:(线程池)