深夜拜读线程池源码,映入眼帘这个东西,让我一头雾水,如下
...
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
}
}
各种查博文,得到了答案,然后开始自己动手实验:
public static void main(String[] args) {
retry:
//循环1
for (int i = 0;i < 10; i++) {
System.out.println("i = " + i);
//循环2
for (int j = 0; j < 10; j++ ) {
System.out.println("j = " + j);
continue retry;
}
}
}
这里使用continue,结果是死循环,再实验。
public static void main(String[] args) {
retry:
//循环1
for (int i = 0;i < 10; i++) {
System.out.println("i = " + i);
//循环2
for (int j = 0; j < 10; j++ ) {
System.out.println("j = " + j);
break retry;
}
}
}
这里是break,运行结果为:
i = 0
j = 0
进程已结束,退出代码 0
这里说明retry是一个标记,与标记最近的循环,这个代码里就是注释循环1的这个for循环。然后在循环2里调用break循环其实执行的是跳出循环1。
那么如果for可以,是不是while也可以呢,我来试一下。
public static void main(String[] args) {
int i = 0;
int j = 0;
retry:
//循环1
while (i == 0) {
System.out.println("i = " + i);
//循环2
while (j == 0) {
System.out.println("j = " + j);
break retry;
}
}
}
果然可以,这样就可以优雅的在跳出多层循环了。
网友评论