Eclipsedebugging器总是阻塞ThreadPoolExecutor,没有任何明显的exception,为什么?

我正在开发通常的Eclipse项目,这是一个J2EE应用程序,由Spring,Hibernate等构成。 我正在使用Tomcat 7(没有特别的原因,我没有利用任何新function,我只是想尝试)。 每当我debugging我的应用程序时,Eclipsedebugging器就会popup来,就像它已经到达断点一样,但事实并非如此,事实上,它停止在一个名为ThreadPoolExecutor的Java源文件上。 控制台上没有堆栈跟踪,只是停止。 然后,如果我点击简历,它继续下去,应用程序完美地工作。 这是在debugging器窗口中显示的内容:

 Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException)) ThreadPoolExecutor$Worker.run() line: 912 TaskThread(Thread).run() line: 619 

我真的不能解释这一点,因为我根本没有使用ThreadPoolExecutor 。 必须是来自Tomcat,Hibernate或Spring的东西。 这是非常烦人的,因为我总是不得不在debugging过程中恢复。

任何线索?

发布的堆栈跟踪表明在守护程序线程中遇到RuntimeException。 这通常在运行时不被捕获,除非原始开发人员捕获并处理exception。

通常情况下,Eclipse中的debugging器被configuration为在抛出exception的位置挂起所有未捕获exception的执行。 请注意,该exception可能稍后处理,在堆栈帧中降低并可能不会导致线程被终止。 这将是观察到的行为的原因。

configurationEclipse的行为很简单:
转到“ 窗口” > “首选项” >“ Java” >“ debugging”,然后取消选中“ 在未捕获的exception上挂起执行”

有一个更具体的解决scheme,它可以防止Eclipse抛出RuntimeException只抛出给定的类。

  1. 从“debugging”透视图中添加一个新的exception断点
  2. 去它的属性
  3. 转到过滤
  4. 在“限定到所选位置”中,点击“ 添加class级
  5. 添加java.util.concurrent.ThreadPoolExecutor
  6. 取消选中checkbox ,意味着这些将被忽略

当webapp被重新加载时,这个行为是由tomcat触发的。 这是tomcat “内存泄漏保护”function的一部分,(除其他外)强制更新其线程。

现在已经从tomcat的7.0.54和8.0.6版本中修复了: https ://issues.apache.org/bugzilla/show_bug.cgi?id=56492

我注意到这经常发生在修改服务器文件(jsp或java)之后,STS无法重新加载应用程序。

这通常会导致重新启动服务器,以使其获得更改同步。

在介绍JRebel之后,它似乎已经消失了。 所以,我想在debugging模式下使用代码时,这在STS中是一个可重现的问题。

通过删除本机热插拔,它消除了ThreadPoolExecutor类中的问题。