Thread.sleep()和断点(Suspend Thread)之间的区别。

问题描述 投票:0回答:2

我正在处理ArcGIS地图实现中的一个奇怪的错误。最近,我注意到,当我在某个地方设置一个断点并在调试模式下运行应用程序时,我们的软件可以正常工作(可能我们面临并发线程问题)。然而,当我用Thread.sleep(2000)替换断点并运行应用程序时,这个错误仍然存在。

对我来说,这真的很奇怪,我以为这两件事会做得完全一样。断点设置为 "Suspend Thread",而且我使用Eclipse IDE。

Java中的put thread to sleep和suspend thread有什么区别?

EDIT:我并不是要求解决这个具体的bug。我只是想知道在这两种情况下,程序的执行有什么不同。

情况一

  1. 打开Eclipse IDE
  2. 在X行设置断点
  3. 调试为... 我的程序
  4. ButtonEvent,程序在X行触及断点。
  5. 我在Eclipse中点击了简历按钮

案例2

  1. 打开Eclipse IDE
  2. 将Thread.sleep(2000)放在X行的最开始。
  3. 调试为... 我的程序
  4. ButtonEvent

把代码粘贴在这里不会有任何区别,因为我不是在问任何特定的代码执行场景,我只是对JVM对待断点的方式是否和对待Thread.sleep()的方式一样感兴趣。当线程在特定时间内进入睡眠状态时,JVM中发生了什么?当线程被暂停时(通过点击断点),在JVM中发生了什么?有什么区别吗?

java multithreading debugging sleep thread-sleep
2个回答
3
投票

有一些相当大的区别,是的。

Thread.sleep请求操作系统将线程从CPU调度中移除n毫秒。 需要注意的是,这个影响是操作系统特有的,主要限于一个线程。

进入断点需要激活JVM的Debug模式,这会影响整个JVM的行为,从而影响到时序。 AMD有 记录了将JVM置于调试模式下的性能影响. 这些影响确实是不同的,其中很多是JVM和调试器之间的通信,以及限制JVM在调试模式下可以进行的优化。 最极端的例子是不让JVM对某些方法使用原生字节码,从而迫使它使用慢得多的解释器。 然而从这个问题的角度来看,最重要的区别在于调试器提供了停止单线程或多线程的功能。

一个线程请求进入睡眠状态,和一个线程导致另一个线程阻塞是有很大区别的。 在Java中,需要线程之间的合作才能停止一个线程,甚至是断点。 在断点的情况下,合作是由JVM为我们完成的,只有当一个线程到达安全点时,才会发生断点。 安全点并不是每一行代码都会发生,因此会对竞赛条件产生相当大的影响,因为JVM必须等待线程到达安全点后才能停止,调试器才能接管。 安全点通常发生在方法调用和循环的后边(但并不总是)。


0
投票

我认为suspend会迫使你使用 Thread.resume() 重新启动 Thread,而如果使用 Thread.sleep().

从API来看,关于 resume(): "该方法使线程处于暂停状态,可以使用 resume() 方法。"

睡觉只会让它停止,但这样你就不用再激活它了。

希望对你有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.