循环之前这个标记是做什么的?

时间:2018-05-23 09:35:04

标签: java

我正在阅读ThreadPoolExecutor的源代码并看到以下代码。

private boolean addWorker(Runnable firstTask, boolean core) {
    retry:
    for (;;) {
        int c = ctl.get();
        int rs = runStateOf(c);

        // Check if queue empty only if necessary.
        if (rs >= SHUTDOWN &&
            ! (rs == SHUTDOWN &&
               firstTask == null &&
               ! workQueue.isEmpty()))
            return false;

        for (;;) {
            int wc = workerCountOf(c);
            if (wc >= CAPACITY ||
                wc >= (core ? corePoolSize : maximumPoolSize))
                return false;
            if (compareAndIncrementWorkerCount(c))
                break retry;
            c = ctl.get();  // Re-read ctl
            if (runStateOf(c) != rs)
                continue retry;
            // else CAS failed due to workerCount change; retry inner loop
        }
    }

请注意上面的retry字词。它有什么作用?我以前从未见过类似的用法。是否有关于此语法的文档?

1 个答案:

答案 0 :(得分:0)

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>JS Bin</title> </head> <body> <div class="topbar"> <script src="https://code.jquery.com/jquery-1.7.2.js"></script> <button class="dropdownToggler">Open Menu</button> <button class="test">toggle `transform` to parent</button> <div class="dropdown">Notifications</div> </div> </body> </html>不是关键字,而是标识符。这是一个标签。请参阅Java Language Specification for the break statement

  

带有标签Identifier的break语句尝试将控制转移到与其标签具有相同标识符的封闭标签语句(第14.7节);此语句称为中断目标,然后立即正常完成。在这种情况下,中断目标不必是switch,while,do或for语句。

默认情况下,添加标识符会导致控件转移到此标签标识的代码部分,而不是像默认情况那样打破最里面的封闭循环。

在这种情况下,当执行到达retry语句时,它将转到标签break retry并从那里继续。