Java:LockSupport.parkNanos vs Thread.sleep(...)

Zo7*_*o72 34 java multithreading

在某些情况下,我们大多数人写这样的事情:

try {
   Thread.sleep(2000); 
} catch (InterruptedException e) {
   ; // do nothing
}
Run Code Online (Sandbox Code Playgroud)

无论是对还是错,只在某些测试工具中可以接受,这不是我的观点.我的观点是,相同的代码可以更简洁地编写,如:

  LockSupport.parkNanos(2000* 1000000);
Run Code Online (Sandbox Code Playgroud)

我有什么理由支持一种方法而不是另一种方法.

Jon*_*eet 16

可读性:Thread.sleep具有非常直观的含义.您如何描述(对另一位开发人员)您的使用LockSupport.parkNanos?如果这样的描述主要是由"我想目前的线程睡觉 ",那么肯定Thread.sleep是更具描述性的.

简洁来自缺乏中断处理 - 因此如果需要,创建一个包装器方法来执行此操作,将异常传播为RuntimeException.哎呀,如果你正在创建一个包装器方法,你可以使用任何一种实现,虽然另一个线程当然可以解开你的"休眠"线程,就像它可以中断它一样...


San*_*rma 14

该方法的文档parkNanos提供了该方法可以返回的条件.其中一个条件是:虚假(即无缘无故)回叫.所以基本上可以使用它,如果你不介意虚假的唤醒和一些其他线程"解除"等待线程的考虑.当然,乔恩的评论几乎指出了选择优先于另一个的理由.

  • 我知道这个答案已经过时了,但它仍然可以帮助开发人员寻找有关 LockSupport 的更多见解。为了完成这个工作,这里有一篇很好的文章展示了这些虚假回报可能是什么样子:https://hazelcast.com/blog/locksupport-parknanos-under-the-hood-and-the-curious-case-of-parking/ TLDR :调用可能会在几微秒后返回,具体取决于 JVM(HotSpot、Dalvik、IBM)甚至主机。 (3认同)