2012-05-01 179 views
27

在某些情况下,我们大多数人这样写:的Java:LockSupport.parkNanos VS了Thread.sleep(...)

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

无论对错,只接受一些测试工具,是不是我的观点。 我的观点是相同的代码可以写成更简洁,如:

LockSupport.parkNanos(2000* 1000000); 

没有任何理由为什么我应该偏向于另一种方法。

回答

14

方法parkNanos提供了该方法可以返回的条件。其中一个条件是:虚假呼叫(即无理由)返回。所以基本上可以使用它,如果你不介意虚假唤醒和其他线程“等待”等待线程的考虑。当然,乔恩的评论几乎可以指出偏好一个而不是另一个的理由。

0

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

从API:

这些方法被设计为用来作为工具,用于创建 更高级别的同步实用程序,而不是本身对于大多数并发控制应用 有用。

+6

大多数情况下,异常处理几乎没用。编码器可以保证线程不会中断...因此我的问题 – Zo72

11

可读性:Thread.sleep具有非常直观的含义。你会如何描述(对另一个开发人员)你使用LockSupport.parkNanos?如果该描述主要由“我想要当前线程睡眠”,那么当然Thread.sleep更具描述性。

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