瞭解下JUC的執行緒池學習三
1.執行緒池的狀態常量,這裡只詳細分析其中一個,其他類同,這裡看RUNNING
狀態:
// -1的補碼為:111-11111111111111111111111111111
// 左移29位後:111-00000000000000000000000000000
// 10進位制值為:-536870912
// 高3位111的值就是表示執行緒池正在處於執行狀態
private static final int RUNNING = -1 << COUNT_BITS;
2.控制變數ctl
的組成就是通過執行緒池執行狀態rs
和工作執行緒數wc
通過或運算得到的:
// rs=RUNNING值為:111-00000000000000000000000000000
// wc的值為0:000-00000000000000000000000000000
// rs | wc的結果為:111-00000000000000000000000000000
private static int ctlOf(int rs, int wc) {
return rs | wc;
}
那麼我們怎麼從ctl
中取出高3位?上面原始碼中提供的runStateOf()
方法就是提取執行狀態:
// 先把COUNT_MASK取反(~COUNT_MASK),得到:111-00000000000000000000000000000
// ctl點陣圖特點是:xxx-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
// 兩者做一次與運算即可得到高3位xxx
private static int runStateOf(int c){
}
同理,取出低29位只需要把ctl
和COUNT_MASK
(000-11111111111111111111111111111
)做一次與運算即可。
注:這裡有一個比較特殊的技巧,由於執行狀態值存放在高3位,
所以可以直接通過十進位制值(甚至可以忽略低29位,直接用ctl
進行比較,或者使用ctl
和執行緒池狀態常量進行比較)
來比較和判斷執行緒池的狀態:
RUNNING(-536870912) < SHUTDOWN(0) < STOP(536870912) < TIDYING(1073741824) < TERMINATED(1610612736)
下面這三個方法就是使用這種技巧:
// ctl和狀態常量比較,判斷是否小於
private static boolean runStateLessThan(int c, int s) {
return c < s;
}
// ctl和狀態常量比較,判斷是否小於或等於
private static boolean runStateAtLeast(int c, int s) {
return c >= s;
}
// ctl和狀態常量SHUTDOWN比較,判斷是否處於RUNNING狀態
private static boolean isRunning(int c) {
return c < SHUTDOWN;
}
最後是執行緒池狀態的躍遷圖:
PS:執行緒池原始碼中有很多中間變數用了簡單的單字母表示,例如c就是表示ctl、wc就是表示worker count、rs就是表示running status。
學習來源:https://www.cnblogs.com/throwable/p/13574306.html