代码之家  ›  专栏  ›  技术社区  ›  Searene

这个for循环之前的标记做什么?[副本]

  •  0
  • Searene  · 技术社区  · 8 年前

    这个问题已经有了答案:

    我在读书 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 回复  |  直到 8 年前
        1
  •  0
  •   S.L. Barth is on codidact.com Monika Restecka    8 年前

    retry 不是关键字,而是标识符。这是个标签。查看 Java Language Specification for the break statement .

    带有标签标识符的break语句试图将控制权转移到与其标签具有相同标识符的封闭标签语句(§14.7);该语句称为break目标,然后立即正常完成。在这种情况下,break目标不需要是switch、while、do或for语句。

    添加标识符不会像默认情况下那样中断最内部的封闭循环,而是会导致控制权转移到由该标签标识的代码部分。

    在这种情况下,当执行到达 break retry 语句,它将转到标签 retry: 然后继续。