Java 线程睡眠 - SleepyCounter 代码解析与分析
Java 线程睡眠 - SleepyCounter 代码解析与分析
代码:
public class SleepyCounter {
public static void main(String[] args) {
Thread SleepyCounter = new Thread(new Runnable() {
public void run() {
for (int i = 10; i <= 500; i++) {
System.out.print(i);
try {
Thread.sleep(5);
System.out.print(' The thread sleeps 5 ms\n');
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
SleepyCounter.start();
}
}
问题: 如果代码中没有输出'The thread sleeps 5 ms',是否意味着线程没有执行睡眠操作?
答案: 是的,如果没有输出'The thread sleeps 5 ms',意味着线程没有执行睡眠操作。可能的原因是线程在打印数字后立即执行了下一次循环,没有等待 5 毫秒。
原因分析:
Thread.sleep(5)方法会使当前线程暂停执行 5 毫秒。- 在代码中,
System.out.print(i);和System.out.print(' The thread sleeps 5 ms\n');的执行时间可能非常短,短于 5 毫秒。 - 如果线程在打印数字后立即开始执行下一轮循环,那么
Thread.sleep(5)就会被跳过,导致没有输出'The thread sleeps 5 ms'。
解决方案:
- 可以通过增加睡眠时间,例如
Thread.sleep(50),来确保线程能够在每次循环中执行睡眠操作。 - 可以使用
System.currentTimeMillis()方法记录时间,在Thread.sleep(5)之后再次记录时间,比较两个时间差,以判断线程是否真正执行了睡眠操作。
总结:
通过代码分析和问题排查,我们了解了 Java 线程睡眠的机制,以及在代码中为什么有时会没有输出'The thread sleeps 5 ms' 的原因。在编写多线程代码时,需要特别注意线程的执行顺序和时间问题,确保程序能够按照预期执行。
原文地址: http://www.cveoy.top/t/topic/pjeF 著作权归作者所有。请勿转载和采集!