在某些情况下,我们大多数人都会这样写:
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
; // do nothing
}
无论是对是错,仅在某些测试工具中可接受,这不是我的观点。我的观点是,可以更简洁地编写相同的代码:
LockSupport.parkNanos(2000* 1000000);
有什么理由我应该赞成一种方法而不是另一种方法。
在某些情况下,我们大多数人都会这样写:
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
; // do nothing
}
无论是对是错,仅在某些测试工具中可接受,这不是我的观点。我的观点是,可以更简洁地编写相同的代码:
LockSupport.parkNanos(2000* 1000000);
有什么理由我应该赞成一种方法而不是另一种方法。
可读性:Thread.sleep
具有非常直观的含义。您将如何(向其他开发人员)描述您对 的使用LockSupport.parkNanos
?如果该描述主要包括“我希望当前线程休眠” ,那么肯定Thread.sleep
更具描述性。
简洁性来自于缺少中断处理——所以如果你愿意,可以创建一个包装器方法来执行此操作,它将异常作为RuntimeException
. 哎呀,如果你正在创建一个包装器方法,你可以使用任何一种实现,尽管另一个线程当然可以解除你的“睡眠”线程,就像它可以中断它一样......
该方法的文档parkNanos
提供了该方法可以返回的条件。其中一个条件是:调用虚假(即无缘无故)返回。因此,如果您不介意虚假唤醒和其他一些线程“取消停放”正在考虑的等待线程,那么基本上可以使用它。当然,乔恩的评论几乎指出了偏爱一个胜过另一个的理由。
LockSupport具有更有限的应用程序,并且不支持异常处理。如果您只需要锁定一个线程,就可以了。
从 API:
这些方法旨在用作创建高级同步实用程序的工具,它们本身对大多数并发控制应用程序没有用处。