优雅的跳出多重循环-retry:

2020-05-12  本文已影响0人  lv_shun

深夜拜读线程池源码,映入眼帘这个东西,让我一头雾水,如下

...
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;
            }
        }
    }

果然可以,这样就可以优雅的在跳出多层循环了。

上一篇 下一篇

猜你喜欢

热点阅读