Java如何使用Label标识符

引言

 在看线程池源码时发现了一个奇怪的用法(java.util.concurrent.ThreadPoolExecutor#addWorker),疑问来了:break,continue都懂,但是这个后面还加个retry是啥意思,前面加个retry:是干嘛的。

		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
            }

先说结论

 看了一圈网上的解答,结果如下:
retry类似于goto,通常与循环放在一起,用于continue/break被retry标识的循环。(不过goto我没用过…)

举个栗子

 小潘对大朗说:你卖炊饼一天干8小时,平均每小时能挣2文钱,我这里需要20文钱买三氧化二砷,你什么时候赚够钱了再回来。大朗看着身旁美丽动人的妻子,嘿笑了两声挑着扁担准备出门。“对了,3天后咱得去隔壁西门庆家串门,不管你挣没挣够都得回来啊!”

 		//一天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. label标识符命名不固定,上面我命名就为abc。
  2. abc标识的是外层循环,break abc指的是直接跳出外层循环。
  3. 如果换成continue abc;指的是:今天赚够了钱,早早下班,明天再接着卖炊饼。

完~

你可能感兴趣的:(Java)