Java-8线程循环

YCF*_*F_L 2 java multithreading java-8

我创建这段代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

当你看到这个,你认为它会打印出来:

Thread number = 1
Thread number = 2
Thread number = 3
Thread number = 4
Thread number = 5
Run Code Online (Sandbox Code Playgroud)

但这不正确它打印一个随机的int和它打印的不合逻辑6有时像:

Thread number = 5
Thread number = 6
Thread number = 6
Thread number = 6
Thread number = 6
Run Code Online (Sandbox Code Playgroud)

我添加Thread.sleep(2000);后:

for (i = 1; i <= 5; i++) {
    new Thread(() -> {
        hello(i);
    }).start();
    Thread.sleep(2000);
}
Run Code Online (Sandbox Code Playgroud)

它向我展示了一个正确的结果:

Thread number = 1
Thread number = 2
Thread number = 3
Thread number = 4
Thread number = 5
Run Code Online (Sandbox Code Playgroud)

为什么它告诉我第一个结果,它显示我6,实际上6不存在?为什么它不打印有序int 1,2,3,...?对此有何解释?

Meh*_*hdi 6

Thread执行Runnable's run方法时,循环可能已经完成它的执行而最后一个值i6,记住你正在做的i<=5这意味着当循环结束时i将等于6.