Java 如何使⽤Label 标识符
引⾔
在看线程池源码时发现了⼀个奇怪的⽤法(.urrent.ThreadPoolExecutor#addWorker),疑问来了:break,continue都懂,但是这个后⾯还加个retry是啥意思,前⾯加个retry:是⼲嘛的。
先说结论
看了⼀圈⽹上的解答,结果如下:
retry类似于goto,通常与循环放在⼀起,⽤于continue/break被retry标识的循环。(不过goto我没⽤过…)
举个栗⼦
⼩潘对⼤朗说:你卖炊饼⼀天⼲8⼩时,平均每⼩时能挣2⽂钱,我这⾥需要20⽂钱买三氧化⼆砷,你什么时候赚够钱了再回来。⼤朗看着⾝旁美丽动⼈的妻⼦,嘿笑了两声挑着扁担准备出门。“对了,3天后咱得去隔壁西门庆家串门,不管你挣没挣够都得回来啊!” retry : for (;;) { int c = ctl .get (); int rs = runStateOf (c ); // Check if queue empty only if necessary. if (rs >= SH
UTDOWN && ! (rs == SHUTDOWN && firstTask == null && ! workQueue .isEmpty ())) return fal ; for (;;) { int wc = workerCountOf (c ); if (wc >= CAPACITY || wc >= (core ? corePoolSize : maximumPoolSize )) return fal ; if (compareAndIncrementWorkerCount (c )) break retry ; c = ctl .get (); // Re-read ctl if (runStateOf (c ) != rs ) continue retry ; // el CAS failed due to workerCount change; retry inner loop }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
总结
1. label标识符命名不固定,上⾯我命名就为abc。
2. abc标识的是外层循环,break abc指的是直接跳出外层循环。
3. 如果换成continue abc;指的是:今天赚够了钱,早早下班,明天再接着卖炊饼。完~ //⼀天8⼩时,每⼩时2⽂,问武⼤郎什么时候能回家 int sum = 0; int day = 1; abc : for (int i = 0; i < 3; i ++) { for (int j = 0; j < 8; j ++) { sum += 2; //挣够了钱就回家
if (sum >= 20) { break abc ; } } //每天1⽂钱开销 sum --; day ++; } System .out .println (String .format ("⾦莲妹妹,我回家了,我总共⽤了%s 天,挣了%s ⽂钱", day ,sum ));1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19