美文网首页
优雅的跳出多重循环-retry:

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

作者: lv_shun | 来源:发表于2020-05-12 23:46 被阅读0次

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

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

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

    相关文章

      网友评论

          本文标题:优雅的跳出多重循环-retry:

          本文链接:https://www.haomeiwen.com/subject/fjpwnhtx.html