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

2022-09-01 01:07:52

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

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

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

  LockSupport.parkNanos(2000* 1000000);

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


答案 1

可读性:具有非常直观的含义。你会如何描述(向另一个开发人员)你对?如果该描述主要由“我希望当前线程休眠”组成,那么肯定更具描述性。Thread.sleepLockSupport.parkNanosThread.sleep

简洁性来自缺乏中断处理 - 因此,如果需要,请创建一个包装器方法来执行此操作,它将异常传播为.哎呀,如果你正在创建一个包装器方法,你可以使用任何一个实现,尽管另一个线程当然可以像中断它一样取消停放你的“睡眠”线程......RuntimeException


答案 2

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