我知道睡眠时间并不精确,也不像操作系统所能做到的那样精确。
假设没有其他极端因素..
我的问题是,如果一个线程开始睡眠10秒,然后GC在5秒后(线程睡眠时间的中间)点击并持续10秒,那么线程会立即停止睡眠吗?还是会Hibernate5秒以上(总共20秒)?
这取决于几个因素,但一般来说,答案必须是< code>15,给或拿(更多的给与拿)。这取决于执行< code>sleep时安全点轮询的位置。在我看来,当线程执行< code>sleep时,它就已经处于安全点了(我认为没有理由这样做,否则maaartinus似乎也有同样的想法)。你可以在这里阅读为什么这很重要。
因此,您的线程已经Hibernate了5秒
,GC
启动并停止世界(AFAIK GC线程“保护”页面,因此会发生“内存保护错误”,这是VM进行安全点轮询的方式),因此整个应用程序停止了10秒
,但墙上的时钟时间仍在继续。因此,多睡5秒是没有意义的;很容易确定线程已经睡够了。
我的问题是,如果一个线程开始睡眠10秒,然后GC在5秒后(线程睡眠时间的中间)点击并持续10秒,那么线程会立即停止睡眠吗?还是会Hibernate5秒以上(总共20秒)?
我想你问的是stop-the-world GC,它不是唯一的或最常见的类型。在这种GC期间,所有非GC线程都没有资格运行,但是< code>sleep() time不会(直接)考虑这一点。
您可以将 sleep()
视为使调用线程在将来的特定时间之前没有资格运行。它通常会在该时间到达后很快恢复,但如果其他东西(例如当时正在运行的 GC)阻止它这样做,那么它的恢复将被推迟到该情况解决之后。换句话说,GC 时间可以与睡眠时间重叠,但两者是独立且独立的因素,每个因素(暂时)阻止线程进行。