线程池源码中存在如下代码,使用retry进行位置标记,然后在break语句中指定跳出到此标记的位置(最外层循环):
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(可以更换为其他)需要紧接着循环进行标记,中间不可以有其它代码。
正确写法:
错误示例:
此外,retry标记(只能在循环关键字之前进行标记for,while,do...while)位置后,只能在break,continue 后进行配对使用。