我在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循环的早期样式中完成这项工作的,其中递增在一个条件中,但为什么不在循环声明行本身中呢?
1条答案
按热度按时间8tntrjer1#
for (int i = 0; i <= 10;)
不会增加变量i
,因此充当无限循环。您的代码不是线程安全的,对的访问没有同步isOdd
在两条线之间。但是,由于循环是无限的,因此每个线程最终都会通过if(isOdd)
或者if(!isOdd)
五次打印数值。当增量放入
for
回路,大部分if
检查将失败,因为线程没有同步,而每个线程只有五次尝试。