Java中的retry

147 阅读2分钟

前言

最近在看线程池的源码,看到了addWorker()方法,在该方法的最开头的retry:,在这之前从来没有遇见过这个东西;那就来一探究竟;

正文

该例子使用双重循环,打印数字,测试代码如下:

    @Test
    public void testTwo() {
        int count = 0;
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 5; j++) {
                count++;
                System.out.println(count + " "+"  i="+i+"  j="+j);
            }
        }
    }

打印结果:

1   i=0  j=0
2   i=0  j=1
3   i=0  j=2
4   i=1  j=0
5   i=1  j=1
6   i=1  j=2

修改代码,判断count是否等于2,在1处分别使用breakcontinuereturn来看打印情况,代码如下:

    @Test
    public void testTwo() {
        int count = 0;
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 3; j++) {
                count++;
                if (count == 2) {
                   // 1
                    break;
                }
                System.out.println(count + " " + "  i=" + i + "  j=" + j);
            }
        }
    }

break打印结果:

1   i=0  j=0
3   i=1  j=0
4   i=1  j=1
5   i=1  j=2

return打印结果:

1   i=0  j=0

continue打印结果:

1   i=0  j=0
3   i=0  j=2
4   i=1  j=0
5   i=1  j=1
6   i=1  j=2

使用retry,代码如下:

@Test
    public void testTwo() {
        int count = 0;
        retry:
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 3; j++) {
                count++;
                if (count == 2) {
                    break retry;
                }
                System.out.println(count + " " + "  i=" + i + "  j=" + j);
            }
        }
    }

打印结果如下:

1   i=0  j=0

说明:使用break retry后,跳出了双重循环,不使用retrybreak只是跳出了当前循环;

使用retry,三重循环,代码如下:

    @Test
    public void testTwo() {
        int count = 0;
        for (int i = 0; i < 2; i++) {
            retury1:
            for (int k = 0; k < 2; k++) {
                for (int j = 0; j < 3; j++) {
                    count++;
                    if (count == 2) {
                        // 1
                        break retury1;
                    }
                    System.out.println(count + " " + "  i=" + i + "  k=" + k + "  j=" + j);
                }
            }
        }
    }

break打印结果如下:

1   i=0  k=0  j=0
3   i=1  k=0  j=0
4   i=1  k=0  j=1
5   i=1  k=0  j=2
6   i=1  k=1  j=0
7   i=1  k=1  j=1
8   i=1  k=1  j=2

说明:该break retury1跳出了两重循环,也就是跳至retury1所在位置;retury1字段不是固定的,起标记作用;

将1处该为continue,结果如下:

1   i=0  k=0  j=0
3   i=0  k=1  j=0
4   i=0  k=1  j=1
5   i=0  k=1  j=2
6   i=1  k=0  j=0
7   i=1  k=0  j=1
8   i=1  k=0  j=2
9   i=1  k=1  j=0
10   i=1  k=1  j=1
11   i=1  k=1  j=2

最后

总结

  1. 字段不是固定的,可为:a,b,c,retury或者retury1等等;
  2. 该字段起标记作用,在循环过程中跳转至标记位置;
  3. break是跳转至标志位置,结束至标志位置的所有循环;
  4. continue是跳转至标记位置,结束至标记位置的一层循环;

参考

  1. java retry使用详解
  2. java里面的retry: