在某些情况下,我们大多数人都写这样的事情:
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
; // do nothing
}
无论是对还是错,只有在某些测试工具中才能接受,这不是我的观点。 我的观点是,相同的代码可以更简洁地编写,如下:
LockSupport.parkNanos(2000* 1000000);
我有什么理由支持一种方法而不是另一种方法。
答案 0 :(得分:16)
可读性:Thread.sleep
具有非常直观的含义。您如何描述(对另一位开发人员)您对LockSupport.parkNanos
的使用?如果该描述主要包含“我希望当前主题 睡眠”,那么肯定Thread.sleep
更具描述性。
简洁来自缺乏中断处理 - 因此如果需要,创建一个包装器方法来执行此操作,将异常传播为RuntimeException
。哎呀,如果你正在创建一个包装器方法,你可以使用任何一种实现,虽然另一个线程当然可以 unpark 你的“休眠”线程,就像它可能会中断它一样......
答案 1 :(得分:14)
方法parkNanos
的文档提供了方法可以返回的条件。其中一个条件是:虚假调用(即无缘无故)返回。所以基本上可以使用它,如果你不介意虚假的唤醒和其他一些线程" unparking"考虑等待的线程。当然,乔恩的评论几乎指出了选择优先于另一个的理由。
答案 2 :(得分:0)
LockSupport的应用程序更为有限,并且不支持异常处理。如果你只需要锁定一个线程,那就没问题。
来自API:
这些方法旨在用作创建工具 更高级别的同步实用程序,而不是它们本身 对大多数并发控制应用程序很有用。