如果ThreadPoolExecutor的commit()方法已经饱和,如何阻止它?

如果ThreadPoolExecutor的commit()方法已经饱和,如何阻止它?

我想创建一个ThreadPoolExecutor当它达到其最大大小并且队列已满时,该submit()方法在尝试添加新任务时阻塞。我是否需要为此实现自定义RejectedExecutionHandler,或者是否存在使用标准Java库执行此操作的方法?



30秒到达战场
浏览 586回答 3
3回答

MM们

请查看以下四种方法:创建NotifyingBlockingThreadPoolExecutor

一只名叫tom的猫

我并不总是喜欢CallerRunsPolicy,特别是因为它允许被拒绝的任务“跳过队列”并在之前提交的任务之前执行。此外,在调用线程上执行任务可能比等待第一个插槽变得可用花费更长的时间。我使用自定义的RejectedExecutionHandler解决了这个问题,它只是暂时阻塞调用线程,然后再次尝试提交任务:public&nbsp;class&nbsp;BlockWhenQueueFull&nbsp;implements&nbsp;RejectedExecutionHandler&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;rejectedExecution(Runnable&nbsp;r,&nbsp;ThreadPoolExecutor&nbsp;executor)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;The&nbsp;pool&nbsp;is&nbsp;full.&nbsp;Wait,&nbsp;then&nbsp;try&nbsp;again. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;waitMs&nbsp;=&nbsp;250; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(waitMs); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(InterruptedException&nbsp;interruptedException)&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executor.execute(r); &nbsp;&nbsp;&nbsp;&nbsp;}}这个类可以像在任何其他类似的RejectedExecutinHandler中一样在线程池执行器中使用,例如:executorPool&nbsp;=&nbsp;new&nbsp;ThreadPoolExecutor(1,&nbsp;1,&nbsp;10, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeUnit.SECONDS,&nbsp;new&nbsp;SynchronousQueue<Runnable>(), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;BlockWhenQueueFull());我看到的唯一缺点是调用线程可能会被锁定比严格必要的时间长(最长250毫秒)。此外,由于这个执行器被有效地递归调用,因此很长时间等待线程可用(小时)可能导致堆栈溢出。不过,我个人喜欢这种方法。它结构紧凑,易于理解,运行良好。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java