我正在阅读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
字词。它有什么作用?我以前从未见过类似的用法。是否有关于此语法的文档?
答案 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
并从那里继续。