我們之前溫習了thread類,明白了runable介面才是多執行緒的任務核心。那麼threadpoolexecutor就是用維護多執行緒的。作為工具類,threadpoolexecutor應該提供了很多操作執行緒的方法,按理說也是逐個去呼叫目標執行緒的方法。那麼我們就詳細了解一下threadpoolexecutor的實現過程吧。我們發現threadpoolexecutor類繼承了abstractexecutorservice。而abstractexecutorservice實現了executorservice,executorservice繼承了executor,executor主要提供execute方法。應該和真正的執行緒start方法掛鉤。在abstractexecutorservice方法中實現了executorservice的介面。executorservice主要包含了執行緒的提交和執行緒的中斷等方法。
作為執行緒管理的工具,那麼threadpoolexecutor就是專門維護執行緒執行的,那麼執行緒的容器也必然在這個類中,也就是我們新建的執行緒會提交到這個類中,然後通過這個類會將提交的runnable任務按照他的安排進行執行。我們看到在threadpoolexecutor中有乙個 private final hashsetworkers = new hashset();其中的worker就是用來儲存runnable任務的工作任務。
worker(runnable firsttask)
按照上邊的邏輯,那麼worker就是我們提交的任務的**,也就是呼叫了start方法。然後呼叫runwroker的方法。而start方法是在addworker中呼叫的
private boolean addworker(runnable firsttask, boolean core)
}boolean workerstarted = false;
boolean workeradded = false;
worker w = null;
try
} finally
if (workeradded)
}} finally
return workerstarted;
}
呼叫真正的執行緒
inal void runworker(worker w) catch (runtimeexception x) catch (error x) catch (throwable x) finally
} finally
}completedabruptly = false;
} finally
}獲取任務佇列
private runnable gettask()
工作執行緒數量
int wc = workercountof(c);
// are workers subject to culling?
boolean timed = allowcorethreadtimeout || wc > corepoolsize;
if ((wc > maximumpoolsize || (timed && timedout)) && (wc > 1 || workqueue.isempty()))
try catch (interruptedexception retry) }}
後置處理
private void processworkerexit(worker w, boolean completedabruptly) finally
將當前執行緒停止
tryterminate();
int c = ctl.get();
if (runstatelessthan(c, stop))
建立新的工作執行緒
addworker(null, false);
}}
Redux createStore原始碼學習
redux apiexport原始碼結構上面我們看到了redux的api和原始碼結構,看的出來,warning.js和index.js不用解析,都看得懂,關鍵時其餘的幾個module,那我們從最重要的createstore講起。export var actiontypes 首先定義了乙個action...
pytorch geometric 原始碼學習
作者大神真的太屌了,膜拜,工程實現能力太強了 本文希望能夠記錄學習其原始碼的過程 data dataset 部分 涉及優化?property 一種python內建裝飾器,可以將乙個成員函式當成成員變數來訪問,例如 class planetoid inmemorydataset url def ini...
logback原始碼閱讀 根據原始碼學擴充套件點 七
原始碼 點選跳轉 1.xml定義 xml version 1.0 encoding utf 8 configuration property name charset value utf 8 name class encoder pattern p d t logger line n m n n p...