我创建了这段代码:
static int i;
public static void main(String[] args) throws InterruptedException {
for (i = 1; i <= 5; i++) {
new Thread(() -> {
hello(i);
}).start();
}
}
public static void hello(int i) {
System.out.println("Thread number = " + i);
}
当您看到这个时,您可能认为它会打印:
Thread number = 1
Thread number = 2
Thread number = 3
Thread number = 4
Thread number = 5
但这不是正确的,它会打印一个随机整数,有时甚至会打印出不合逻辑的数字
6
,例如:Thread number = 5
Thread number = 6
Thread number = 6
Thread number = 6
Thread number = 6
我在以下代码后添加了Thread.sleep(2000);
for (i = 1; i <= 5; i++) {
new Thread(() -> {
hello(i);
}).start();
Thread.sleep(2000);
}
它向我展示了正确的结果:
Thread number = 1
Thread number = 2
Thread number = 3
Thread number = 4
Thread number = 5
为什么第一个结果显示 6,但实际上并不存在 6?为什么它没有按照顺序打印出 1、2、3……等数字?请解释一下。
i == 5
时运行并将其增加到6
。只有当你使用<=
时,它才会从循环中跳出。主线程在循环中非常快,新创建的线程只能看到i
作为6
,而没有在循环内休眠主线程。 - jlordoi
的值,而不是循环迭代时的值的副本。 - Peter Lawreyi == 6
不存在,你的循环就不会停止。 - Peter Lawrey