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)
时相同MyQueue
是BlockingQueue
的一个实现,它接受0作为容量(也就是说,它只能是空的。这当然不是一个队列,但实现它可以与JDK提供的ThreadPoolExecutor
无缝集成。)李>
进一步考虑:
通过对线程池进行这样的微调,请注意吞吐量将受到限制。这里,考虑到4个线程和提交到线程池的任务的平均延迟
L
(以秒为单位),此配置允许的平均吞吐量为4/L
任务/秒。这是我正在寻找的解决方案,但我必须创建自己的BlockingQueue实现,因为LinkedBlockingQueue在容量参数为@DamianU时抛出IllegalArgumentException。对了,抱歉,我认为它会接受它。@DamianU您不需要实现自己的队列,这是您要找的。