当前位置: 首页 > 面试题库 >

可能是RejectedExecutionException的原因

赵景曜
2023-03-14
问题内容

我在雄猫服务器(+ liferay)上收到此异常

java.util.concurrent.RejectedExecutionException

我的课是这样的:

public class SingleExecutor extends ThreadPoolExecutor {
  public SingleExecutor(){
    super(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
  }

  @Override
  public void execute(Runnable command) {
    if(command instanceof AccessLogInsert){
        AccessLogInsert ali = (AccessLogInsert)command;
        ali.setConn(conn);
        ali.setPs(ps);
    }
    super.execute(command);
  }
}

我在行上收到此异常,super.execute(command); 当队列已满但LinkedBlockingQueue大小为2 ^
31时,可能会发生此错误,并且我确定没有那么多命令在等待。

一开始一切都稳定,但在我重新部署战争后,一切开始发生。此类不是战争的一部分,而是放在tomcat / lib中的jar中。

您是否知道为什么会发生这种情况以及如何解决?


问题答案:

从ThreadPoolExecutor
JavaDoc(重点是我的)

在方法提交的新任务execute(java.lang.Runnable)将被拒绝
时,Executor已经关机时,也Executor使用有限的边界两个最大html" target="_blank">线程和工作队列容量,且饱和。无论哪种情况,execute方法都将调用其RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)方法RejectedExecutionHandler。提供了四个预定义的处理程序策略:

1.
默认情况下ThreadPoolExecutor.AbortPolicy,处理程序RejectedExecutionException在拒绝时抛出运行时。
2.
在中ThreadPoolExecutor.CallerRunsPolicy,调用执行自己的线程运行任务。这提供了一种简单的反馈控制机制,它将降低新任务的提交速度。
3. 在中ThreadPoolExecutor.DiscardPolicy,简单地删除了无法执行的任务。
4.
在中ThreadPoolExecutor.DiscardOldestPolicy,如果未关闭执行程序,则将丢弃工作队列开头的任务,然后重试执行(这可能再次失败,从而导致重复执行此操作)。

可以定义和使用其他种类的RejectedExecutionHandler类。这样做需要格外小心,尤其是在设计策略仅在特定容量或排队策略下才能工作时。

因此,大概是重新加载战争会触发的关闭Executor。尝试将相关的库放入战场,以便Tomcat
ClassLoader更有机会正确地重新加载您的应用程序。



 类似资料:
  • 问题内容: 当Java VM因EXCEPTION_ACCESS_VIOLATION崩溃并生成hs_err_pidXXX.log文件时,这表明什么?错误本身基本上是空指针异常。它是否总是由JVM中的错误引起,还是有其他原因(如硬件故障或软件冲突)? 编辑:有一个本机组件,这是win32上的SWT应用程序。 问题答案: 在大多数情况下,这是VM中的错误。但这可能是由任何本机代码(例如JNI调用)引起的

  • 当然在文件结束或输入错误发生时返回,但这是否意味着没有更多的数据可用? 使用

  • 我有一个复杂的应用程序,有很多第三方库,动态加载的插件。并且在main退出后,某个东西会导致应用程序崩溃()。调用堆栈指向未知地址,因此我不仅无法调试,甚至不知道崩溃发生在哪里。 我试着用运行这个应用程序--它显示了泄漏(一些千字节),但我认为它们是误报,并且/或者我无法对它们做任何处理,因为它们来自第三方。 我的问题:我相信内存泄漏不可能造成一个分段故障,至少我找不到可能的场景。但因为我不确定,

  • 这也没有空格啊,为什么会高出一些? font-size: 0; 这样可以解决,但空格都没有这个属性作用到哪里去了?

  • 我有一个使用activeMQ消息的项目。它运行良好,但有时会遇到挂起的消息卡在队列中。它说1000入队,0出队,1000分派。它还说1000条待处理的消息。 “待定消息”的可能原因是什么?

  • 问题内容: 什么样的问题可能会导致Java的ProcessBuilder.start方法返回IOException并带有错误码= 5的注释? 具体来说,我们已经看到了一个远程客户系统,它按照以下方式运行一些Java代码: …抛出这样的异常… 我们已经确认异常中提到的命令“ C:\ example \ example.exe arguments1 arguments2”可以通过cmd.exe手动成功