我选择A,B。但关键答案只有B,是否存在A也可能发生的情况?谁能为我澄清一下?
是的,根据您的应用程序,您当然可能会获得 500 毫秒的睡眠时间,而不是一纳秒以上。
但是,更好的答案的原因B
是不能保证任何线程何时会再次运行。您可能有一个具有大量 CPU 绑定线程的应用程序。即使睡眠线程现在可以运行,它也可能在很长一段时间内没有任何周期。精确的睡眠时间还很大程度上取决于 OS 线程调度程序和时钟精度的细节。您的应用程序还可能必须与同一系统上的其他应用程序竞争,这可能会延迟其继续执行。
例如,在我极快的 8xi7 CPU Macbook Pro 上的以下程序显示最大睡眠时间为 604 毫秒:
public class MaxSleep {
public static void main(String[] args) throws Exception {
final AtomicLong maxSleep = new AtomicLong(0);
ExecutorService threadPool = Executors.newCachedThreadPool();
// fork 1000 threads
for (int i = 0; i < 1000; i++) {
threadPool.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
long total = 0;
// spin doing something that eats CPU
for (int j = 0; j < 10000000; j++) {
total += j;
}
// this IO is the real time sink though
System.out.println("total = " + total);
try {
long before = System.currentTimeMillis();
Thread.sleep(500);
long diff = System.currentTimeMillis() - before;
// update the max value
while (true) {
long max = maxSleep.get();
if (diff <= max) {
break;
}
if (maxSleep.compareAndSet(max, diff)) {
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
threadPool.shutdown();
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
System.out.println("max sleep ms = " + maxSleep);
}
}