42

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

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

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

  LockSupport.parkNanos(2000* 1000000);

有什么理由我应该赞成一种方法而不是另一种方法。

4

3 回答 3

21

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

简洁性来自于缺少中断处理——所以如果你愿意,可以创建一个包装器方法来执行此操作,它将异常作为RuntimeException. 哎呀,如果你正在创建一个包装器方法,你可以使用任何一种实现,尽管另一个线程当然可以解除你的“睡眠”线程,就像它可以中断它一样......

于 2012-05-01T12:59:00.070 回答
19

该方法的文档parkNanos提供了该方法可以返回的条件。其中一个条件是:调用虚假(即无缘无故)返回。因此,如果您不介意虚假唤醒和其他一些线程“取消停放”正在考虑的等待线程,那么基本上可以使用它。当然,乔恩的评论几乎指出了偏爱一个胜过另一个的理由。

于 2012-05-01T13:00:25.763 回答
1

LockSupport具有更有限的应用程序,并且不支持异常处理。如果您只需要锁定一个线程,就可以了。

从 API:

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

于 2012-05-01T12:57:42.567 回答