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

时间:2012-05-01 12:51:35

标签: java multithreading

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

try {
   Thread.sleep(2000); 
} catch (InterruptedException e) {
   ; // do nothing
}

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

  LockSupport.parkNanos(2000* 1000000);

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

3 个答案:

答案 0 :(得分:16)

可读性:Thread.sleep具有非常直观的含义。您如何描述(对另一位开发人员)您对LockSupport.parkNanos的使用?如果该描述主要包含“我希望当前主题 睡眠”,那么肯定Thread.sleep更具描述性。

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

答案 1 :(得分:14)

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

答案 2 :(得分:0)

LockSupport的应用程序更为有限,并且不支持异常处理。如果你只需要锁定一个线程,那就没问题。

来自API:

  

这些方法旨在用作创建工具   更高级别的同步实用程序,而不是它们本身   对大多数并发控制应用程序很有用。