在 Java 8 中使用线程和 lambda 按顺序打印数字
Print numbers in sequence using threads and lambdas in Java 8
我在 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 递增为 i+=2,就像
for(int i=0; i<10; i+=2)
我得到一个输出 Even thread= 0 然后程序停止执行。这个线程和 lambda 如何在早期的 for 循环样式中完成这项工作,其中递增在条件内,但为什么不在循环声明行本身中?
for (int i = 0; i <= 10;)
不会增加变量 i
,因此充当无限循环。您的代码不是 thread-safe,两个线程之间对 isOdd
的访问没有同步。然而,由于循环是无限,每个线程最终将通过if(isOdd)
或if(!isOdd)
五次并打印值。
当增量放在for
循环中时,由于线程不同步,大多数if
检查都会失败,而每个线程只有五次尝试。
我在 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 递增为 i+=2,就像
for(int i=0; i<10; i+=2)
我得到一个输出 Even thread= 0 然后程序停止执行。这个线程和 lambda 如何在早期的 for 循环样式中完成这项工作,其中递增在条件内,但为什么不在循环声明行本身中?
for (int i = 0; i <= 10;)
不会增加变量 i
,因此充当无限循环。您的代码不是 thread-safe,两个线程之间对 isOdd
的访问没有同步。然而,由于循环是无限,每个线程最终将通过if(isOdd)
或if(!isOdd)
五次并打印值。
当增量放在for
循环中时,由于线程不同步,大多数if
检查都会失败,而每个线程只有五次尝试。