ThreadPoolExecutor-如果池已满,是否可以引发异常

时间:2019-02-18 08:41:59

标签: multithreading kotlin concurrency java.util.concurrent threadpoolexecutor

如果无法处理传入请求,是否可以引发异常?

所以,我有一些固定的线程池:

private val executor: ThreadPoolExecutor = Executors.newFixedThreadPool(4) as ThreadPoolExecutor

我不希望请求如果无法处理就进入线程队列,我只想抛出异常。

我正在尝试检查activeCount并抛出异常(如果该值大于最大池大小),但它无法按照我的意愿运行。

private fun checkPoolSize() {
    if (executor.activeCount >= 4) {
        throw RuntimeException("Request can't be handled. ")
    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用饱和策略,该策略在边界队列填满时会发挥作用。您可以通过调用setRejectedExecutionHandler()中的ThreadPoolExecutor来设置饱和策略。现成的实现是AbortPolicyCallerRunsPolicyDiscardPolicyDiscardOldestPolicy。默认情况下,AbortPolicyRejectedExecutionException,当队列已满时将抛出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 */

一些注意事项:

  • 0秒(第3和第4个参数)对应于核心线程的保持活动时间。设置为0表示您的核心线程即使处于空闲状态也不会停止。这是使用Executors.newFixedThreadPool(4)时的默认行为。
  • Executors.defaultThreadFactory()是默认的线程工厂,与使用Executors.newFixedThreadPool(4)时相同。
  • 此处核心和最大线程池大小设置为4(第一个参数和第二个参数),这对于您的用例来说似乎是合适的。
  • MyQueueBlockingQueue的实现,它接受0作为容量(即只能为空。这当然不是队列,但是实现此功能可以与{{1 }}由JDK提供。)。

进一步考虑

对线程池进行这种微调时,请注意吞吐量将受到限制。这里,考虑到4个线程和提交给线程池的任务的平均延迟ThreadPoolExecutor(以秒为单位),此配置允许的平均吞吐量为L个任务/秒。