JavaでLabel識別子を使用する方法

7977 ワード

引用する
 スレッドプールのソースコードを見ていると、変な使い方(java.util.conncurrent.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時間働いて、平均して1時間に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));

まとめ
  • label識別子の命名は固定されていません.私の名前はabcです.
  • abcは外層サイクルを表し、break abcは直接外層サイクルから飛び出すことを指す.
  • continue abcに変更すると;今日はもう十分稼いで、早く退勤して、明日また炊事饼を売っています.

  • 完~