线程池之拒绝策略

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


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


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


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会返回一个值。



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值