编辑:好的,这真的很愚蠢,但我不知道为什么我没有看到它是没有通常增量的正常循环。我希望当我发布这个问题时我喝醉了,因为现在我感到超级白痴。无论如何,谢谢你!
我正在学习一些关于Java多线程的教程,以便尽可能多地收集信息和示例。
在Oracle网站上有一个关于Java Concurrency的官方教程,我正在查看Guarded Blocks部分(here)。
虽然所有概念都很清楚,但我正在阅读页面底部的Producer / Consumer示例,而我不了解代码的某些部分。
具体来说,下面是Consumer类的run()方法的代码,我不明白for循环应该如何工作。它甚至看起来都不适用于我。
任何人都可以解释一下吗?
public void run() {
Random random = new Random();
for (String message = drop.take();
! message.equals("DONE");
message = drop.take()) {
System.out.format("MESSAGE RECEIVED: %s%n", message);
try {
Thread.sleep(random.nextInt(5000));
} catch (InterruptedException e) {}
}
}
答案 0 :(得分:0)
这只是以非惯用的方式使用循环。
您有初始化String message = drop.take();
(而不是int i = 0;
)。
然后你有了测试!message.equals("DONE");
(而不是i < 10
)。
最后你有“增量”或循环前进或任何实际术语。使用message = drop.take();
(而不是i++
)获取下一个值。
答案 1 :(得分:0)
转换为while循环时可能会更容易理解:
public void run() {
Random random = new Random();
String message = drop.take()
while (!message.equals("DONE")) {
System.out.format("MESSAGE RECEIVED: %s%n", message);
try {
Thread.sleep(random.nextInt(5000));
} catch (InterruptedException e) {}
message = drop.take()
}
}
请记住,for循环通常由三部分组成:
for (INITIALIZATION; CONDITION; AFTERTHOUGHT)
{
// Code for the for-loop's body goes here.
}
INITIALIZATION在第一次迭代之前运行一次,在每次迭代之前检查CONDITION,在每次迭代之后执行AFTERTHOUGHT。
(取自https://en.wikipedia.org/wiki/For_loop#Traditional_for-loops)
因此,在此示例中,for循环的INITIALIZATION创建消息变量并从 drop 获取第一条消息。然后它在CONDITION块中检查它,看它是否是 DONE 。如果是,则循环体执行一次,打印消息并休眠最多5000毫秒。然后在AFTERTHOUGHT子句中接收下一条消息,循环再次检查CONDITION块以打印下一条消息,或者在收到 DONE 后离开循环。