Guarded Blocks上的Java Oracle示例

时间:2016-09-08 07:40:40

标签: java oracle concurrency

编辑:好的,这真的很愚蠢,但我不知道为什么我没有看到它是没有通常增量的正常循环。我希望当我发布这个问题时我喝醉了,因为现在我感到超级白痴。无论如何,谢谢你!

我正在学习一些关于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) {}
        }
    }

2 个答案:

答案 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 后离开循环。