如果无法处理传入请求,是否可以引发异常?
所以,我有一些固定的线程池:
private val executor: ThreadPoolExecutor = Executors.newFixedThreadPool(4) as ThreadPoolExecutor
我不希望请求如果无法处理就进入线程队列,我只想抛出异常。
我正在尝试检查activeCount并抛出异常(如果该值大于最大池大小),但它无法按照我的意愿运行。
private fun checkPoolSize() {
if (executor.activeCount >= 4) {
throw RuntimeException("Request can't be handled. ")
}
}
答案 0 :(得分:2)
您可以使用饱和策略,该策略在边界队列填满时会发挥作用。您可以通过调用setRejectedExecutionHandler()
中的ThreadPoolExecutor
来设置饱和策略。现成的实现是AbortPolicy
,CallerRunsPolicy
,DiscardPolicy
和DiscardOldestPolicy
。默认情况下,AbortPolicy
是RejectedExecutionException
,当队列已满时将抛出def change_value(idnumber):
db_value = get_db_status_value(idnumber)
if db_value is True:
change_db_entry_status(idnumber, False)
else:
change_db_entry_status(idnumber, True)
。您还可以提供自己的自定义实现。
答案 1 :(得分:2)
对此的一种解决方案是将容量为0且java.util.concurrent.ThreadPoolExecutor.AbortPolicy
的队列用作RejectedExecutionHandler
。
Executors
中的静态方法未公开为此所需的完整参数集,因此您将需要直接实例化ThreadPoolExecutor
。就您而言,您可以使用以下代码:
new ThreadPoolExecutor(4, /* Core pool size */
4, /* Max pool size */
0, TimeUnit.SECONDS, /* Core th. keep-alive */
new MyQueue<Runnable>(0), /* No queueing allowed */
Executors.defaultThreadFactory(), /* default */
new AbortPolicy()) /* throws when all core threads busy */
一些注意事项:
Executors.newFixedThreadPool(4)
时的默认行为。Executors.defaultThreadFactory()
是默认的线程工厂,与使用Executors.newFixedThreadPool(4)
时相同。MyQueue
是BlockingQueue
的实现,它接受0作为容量(即只能为空。这当然不是队列,但是实现此功能可以与{{1 }}由JDK提供。)。 进一步考虑:
对线程池进行这种微调时,请注意吞吐量将受到限制。这里,考虑到4个线程和提交给线程池的任务的平均延迟ThreadPoolExecutor
(以秒为单位),此配置允许的平均吞吐量为L
个任务/秒。