前言
最近在看线程池的源码,看到了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处分别使用break
,continue
,return
来看打印情况,代码如下:
@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
后,跳出了双重循环,不使用retry
的break
只是跳出了当前循环;
使用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
最后
总结
- 字段不是固定的,可为:
a
,b
,c
,retury
或者retury1
等等; - 该字段起标记作用,在循环过程中跳转至标记位置;
break
是跳转至标志位置,结束至标志位置的所有循环;continue
是跳转至标记位置,结束至标记位置的一层循环;