JavaでLabel識別子を使用する方法
7977 ワード
引用する
スレッドプールのソースコードを見ていると、変な使い方(java.util.conncurrent.ThreadPoolExecutor#addWorker)を見つけました.質問が来ました.break、continueは知っていますが、この後ろにretryを付けるのはどういう意味ですか.前にretryを付けるのは何ですか.
結論を先に述べる
retryはgotoに似ており、通常はループとともに配置され、continue/breakがretryによって識別されるループに使用される.(でもgoto使ったことないけど…)
くりを一つあげる
潘さんは大朗さんに言いました.「炊事餅を売って一日8時間働いて、平均して1時間に2文のお金を稼ぐことができます.私のところには20文のお金が必要です.三酸化二ヒ素を買う必要があります.いつお金を稼いでから帰ってきますか.」大朗は隣の美しい妻を見て、笑って天秤棒を担いで出かけようとした.「そうだ、3日後に隣の西門慶の家に行かなければならない.
まとめ label識別子の命名は固定されていません.私の名前はabcです. abcは外層サイクルを表し、break abcは直接外層サイクルから飛び出すことを指す. continue abcに変更すると;今日はもう十分稼いで、早く退勤して、明日また炊事饼を売っています.
完~
スレッドプールのソースコードを見ていると、変な使い方(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));
まとめ
完~