在Java8中使用线程和lambda按顺序打印数字

6bc51xsx  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(583)

我在java中遇到了使用两个线程按顺序打印数字的代码。这是密码

public class ThreadPrint {
    public static boolean isOdd = false;

    public static void main(String[] args) throws InterruptedException {
        Runnable even = () -> {
            for (int i = 0; i <= 10;)
                if (!isOdd) {
                    System.out.println("Even thread = " + i);
                    i = i + 2;
                    isOdd = !isOdd;
                }
        };
        Runnable odd = () -> {
            for (int i = 1; i <= 10;)
                if (isOdd) {
                    System.out.println("odd thread = " + i);
                    i = i + 2;
                    isOdd = !isOdd;
                }
        };

        Thread e = new Thread(even);
        Thread o = new Thread(odd);

        e.start();
        o.start();
    }
}

我的问题是,如果我在循环中增加i+=2,就像

for(int i=0; i<10; i+=2)

我得到一个偶数线程=0的输出,然后程序停止执行。这个线程和lambda是如何在for循环的早期样式中完成这项工作的,其中递增在一个条件中,但为什么不在循环声明行本身中呢?

8tntrjer

8tntrjer1#

for (int i = 0; i <= 10;) 不会增加变量 i ,因此充当无限循环。您的代码不是线程安全的,对的访问没有同步 isOdd 在两条线之间。但是,由于循环是无限的,因此每个线程最终都会通过 if(isOdd) 或者 if(!isOdd) 五次打印数值。
当增量放入 for 回路,大部分 if 检查将失败,因为线程没有同步,而每个线程只有五次尝试。

相关问题