Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading ThreadPoolExecutor-如果池已满,是否可以引发异常_Multithreading_Kotlin_Concurrency_Java.util.concurrent_Threadpoolexecutor - Fatal编程技术网

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

Multithreading ThreadPoolExecutor-如果池已满,是否可以引发异常,multithreading,kotlin,concurrency,java.util.concurrent,threadpoolexecutor,Multithreading,Kotlin,Concurrency,Java.util.concurrent,Threadpoolexecutor,如果传入请求无法处理,是否可能引发异常 因此,我有一些固定线程池: private val executor: ThreadPoolExecutor = Executors.newFixedThreadPool(4) as ThreadPoolExecutor 若不能处理请求,我不希望请求进入线程队列,我只想抛出异常 我正在尝试检查activeCount,并在其大于最大池大小时抛出异常,但它无法正常工作 private fun checkPoolSize() { if (executo

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

因此,我有一些固定线程池:

private val executor: ThreadPoolExecutor = Executors.newFixedThreadPool(4) as ThreadPoolExecutor
若不能处理请求,我不希望请求进入线程队列,我只想抛出异常

我正在尝试检查activeCount,并在其大于最大池大小时抛出异常,但它无法正常工作

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

您可以使用一个饱和策略,该策略在有界队列填满时起作用。您可以通过调用
ThreadPoolExecutor
setRejectedExecutionHandler()
来设置饱和策略。现成的实现包括
中止策略
调用方策略
丢弃策略
丢弃最新策略
AbortPolicy
是默认值,当有界队列填满时,它会抛出
RejectedExecutionException
。您还可以提供自己的自定义实现。

一种解决方案是使用容量为0的队列和
java.util.concurrent.ThreadPoolExecutor.AbortPolicy
作为
拒绝执行处理程序

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 */
new ThreadPoolExecutor(4,/*核心池大小*/
4、/*最大池大小*/
0,TimeUnit.SECONDS,/*Core th.保持活动状态*/
新建MyQueue(0),/*不允许排队*/
Executors.defaultThreadFactory(),/*默认值*/
新的AbortPolicy())/*在所有核心线程都忙时抛出*/
一些注意事项:

  • 0秒(第3和第4个参数)对应于核心线程保持活动时间。设置0意味着您的核心线程永远不会停止,即使它们保持空闲状态。这是使用执行器时的默认行为。newFixedThreadPool(4)
  • Executors.defaultThreadFactory()
    是默认线程工厂,与使用
    Executors.newFixedThreadPool(4)
    时相同
  • 在这里,核心和最大线程池大小被设置为4(第一个和第二个参数),这对于您的用例来说似乎是合适的
  • MyQueue
    BlockingQueue
    的一个实现,它接受0作为容量(也就是说,它只能是空的。这当然不是一个队列,但实现它可以与JDK提供的
    ThreadPoolExecutor
    无缝集成。) 进一步考虑


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

    这是我正在寻找的解决方案,但我必须创建自己的BlockingQueue实现,因为LinkedBlockingQueue在容量参数为@DamianU时抛出IllegalArgumentException。对了,抱歉,我认为它会接受它。@DamianU您不需要实现自己的队列,这是您要找的。