Zeppelin 原始碼分析-排程和資源分析(2)
Scheduler 類
Scheduler 類是排程類的抽象類,其中定義了很多關鍵方法,比如 submit 方法等,並且是一個執行緒類,一直執行在主程序或者獨立 JVM 程序。
RemoteScheduler 類
RemoteScheduler 類是執行在主程序的排程類,支援併發操作,實現的方式就是之前說過的將 Job 封裝成 RemoteScheduler.JobRunner 類,RemoteScheduler 中維護兩個佇列,queue 用於儲存所有的需要執行的 Job,running 用於儲存正在執行的 Job,由於該類在主程序,所有同一時間可能會有多個直譯器 JVM 中的 Job 正在執行,所以 running 是一個佇列,在 FIFOScheduler 中,該屬性其實就是一個物件,因為先進先出排程同一時間只能有一個正在執行的 Job 類的物件:
List<Job> queue = new LinkedList<>();
List<Job> running = new LinkedList<>();
該執行緒中 run 方法流程如下:
首先當正在執行的 Job 總數大於閾值或者任務 queue 是空的時候,等待 0.5s ,其他情況下從佇列中取出一個 Job 並加入到 running 佇列中:
synchronized (queue) {
if (running.size() >= maxConcurrency || queue.isEmpty() == true ) {
try {
queue.wait(500);
} catch (InterruptedException e) {
logger.error("Exception in RemoteScheduler while run queue.wait", e);
}
continue;
}
job = queue.remove(0);
running.add(job);
}
然後對 job 封裝成 JobRunner 的物件 jobRunner,封裝原因在 Job 相關類中說過,封裝之後直接將 jobRunner 直接扔到 Java 自帶的執行緒池執行:
Scheduler scheduler = this;
JobRunner jobRunner = new JobRunner(scheduler, job);
executor.execute(jobRunner);
一旦該 job 被提交到直譯器 JVM,則進行下一次迴圈,重複以上步驟。
ParallelScheduler 類
這個類是執行在直譯器 JVM 中的排程類,支援併發 Job,實現的方式是 Job 封裝成 ParallelScheduler.JobRunner 類,程式碼基本和 RemoteScheduler 相似,這裡不再贅述。
FIFOScheduler 類
這個類也是執行在直譯器 JVM 中的排程類,只不過不支援併發,由於比較簡單,這裡不再贅述。
SchedulerListener 類
SchedulerListener 介面中定義了兩個方法,jobStarted 和 jobFinished 方法,它唯一的實現類是 SchedulerFactory 類,實現類中這兩個方法都是向日志中輸出一句話。
SchedulerFactory 類
這個類是建立各種排程的工廠類,呼叫 reateOrGetXXXScheduler 的時候,返回的已經是在執行的執行緒了:
public Scheduler createOrGetFIFOScheduler(String name) {
synchronized (schedulers) {
if (schedulers.containsKey(name) == false) {
Scheduler s = new FIFOScheduler(name, executor, this);
schedulers.put(name, s);
executor.execute(s);
}
return schedulers.get(name);
}
}
Java 執行緒池參考資料
相關推薦
Zeppelin 原始碼分析-排程和資源分析(2)
Scheduler 類 Scheduler 類是排程類的抽象類,其中定義了很多關鍵方法,比如 submit 方法等,並且是一個執行緒類,一直執行在主程序或者獨立 JVM 程序。 RemoteScheduler 類 RemoteScheduler
原始碼分析篇--Java集合操作(2)
4、兩大集合介面 在Java集合中,有兩大集合,一個是Collection介面及其實現類,另一個是Map介面及其實現類。下面給出這兩種集合的框架圖。如下所示。 4.1Collection介面框架圖 4.2Map介面框架圖 從上面兩個框架圖可以看出,Cllection介面和Map介面是
文字內容分析和智慧反饋(2)- 資料預處理和按緯度統計
書接上文,考慮4個核心功能的實現,先考慮:資料預處理和按緯度統計。 1、資料預處理 1.1、基本原則 首先,考慮資料的格式。 業務資料是儲存在關係型資料庫中的。資料分析的部分,我們將使用Weka,雖然Weka習慣ARFF格式,為了實現資料分析和提取的
LevelDB原始碼分析之六:skiplist(2)
閱讀本文可參考: LevelDB中的skiplist實現方式基本上和中的實現方式類似。它向外暴露介面非常簡單,如下: public: // Create a new SkipList object that will use "cmp" for compar
JavaScript案例分析:圖片庫改進版(2)
1.優化 showPic函式中裡仍存在一些需要處理的假設 ①檢查title屬性是否存在,可以測試它是否為null var text=whichpic.getAttribute("title")?whichpic.get
劉軍《社會網路分析導論》閱讀筆記(2)---第五章
第五章 中心性——權力的量化分析 中心度和中心勢 點度中心度(區域性性的) 點度中心度是區域性性的中心!! 絕對點度中心度:點度中心度就是該點的度數。 相對點度中心度 無向圖中某點的相對點度中心度:該點的度數/(圖中點總數-1) 有向圖中某點的相對點度
Python資料分析與挖掘學習筆記(2)使用pandas進行資料匯入
一、匯入pandas模組: import pandas as pda 二、匯入CSV格式資料: #資料匯入 i=pda.read_csv("E:/hexun.csv") 可對匯入的資料進行統計以及按列排序: #統計 i.describe() #排序 i
oracle分析函式row_number() over()使用(2)
row_number() over ([partition by col1] order by col2) ) as 別名表示根據col1分組,在分組內部根據 col2排序而這個“別名”的值就表示每組內部排序後的順序編號(組內連續的唯一的),[partition by col1] 可省略。 以Scott/ti
深入分析Java Web技術內幕(2)java的I/O的工作機制(一)
1、背景 當前這個 海量資料時代,資料在網路中隨處流動,流動的過程都涉及I/O問題,可以說大部分web應用系統的瓶頸都是I/O瓶頸。2、i/o是什麼 1】 是input和output的簡寫,i/o操作主要是指使用java進行輸入輸出操作,java所有的i/o
C# 《四》表達式和運算符(2)
技術分享 -a 按位運算 表達式 其他 img 數學 tro .cn 1、位運算符 1、位(bit):在計算中存儲所有數據都采用二進制,那麽二進制的位,便是我們所說的 bit。 1)1Byte = 8bit 1字節 = 8位 2)1k =10
第11課 std::bind和std::function(2)_std::bind綁定器
pan std name iostream emf end cnblogs left eid 1. 溫故知新:std::bind1st和std::bind2nd (1)bind1st、bind2nd首先它們都是函數模板,用於將參數綁定到可調用對象(如函數、仿函數等)的第1個
《Python基礎教程》第二章:列表和元組(2)
ber 次數 eve sorted 反向 bsp del 對象 復制 list函數可以將字符串轉換為列表 ‘ ‘.join(somelist)可以將列表轉換為字符串 從列表中刪除元素可以使用del語句來實現 方法是與對象有緊密聯系的函數:對象.方法(參數) append方
棧和隊列(2)
實現 放置 怎麽 事情 棧操作 ron bsp 使用 alt 一、題目:僅用遞歸函數和棧操作逆序一個棧 將一個棧裏面的元素逆序,只能用遞歸函數來實現,不能用其他數據結構。 只能用遞歸函數來實現 可以使用現成的棧類型 思路: 為了將棧逆序,只需要按順序將棧頂至棧底的元素拿
Android的資源引用(2)(Drawable)
一、Drawable資源通常存放在/res/drawable目錄下面。 二、圖片資源 圖片資源是最簡單的Drawable資源.只要把*.png,*.jpg,*.gif 等格式的圖片放入目錄下面就可以使用,Android SDK會在編譯時自動載入圖片,並在R資源清單中生成索引。 在java
Python語言資料結構和語言結構(2)
1. Python預備基礎 變數的命名 變數命名規則主要有以下幾條: 變數名只能包含字母、數字和下劃線,其中下劃線和字母可以開頭,數字不行,即info_1可以,而1_info不行; 變數名內不能包含空格,可以用下劃線替代,即info_1,而非info 1; 不能與Pyt
第三章 處理機排程與死鎖(2)
四、產生死鎖的原因和必要條件 死鎖(Deadlock):指程序之間無休止地互相等待 飢餓(Starvation):指一個程序無休止地等待 產生死鎖的原因: 1.競爭資源。 系統中供多個程序共享的資源如印表機、公用佇列等的數目不滿足需要時,會引起資源競爭而產生死鎖。 可把系統中的資源分為兩
Google guava cache原始碼解析1--構建快取器(2)
此文已由作者趙計剛授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 CacheBuilder-->maximumSize(long size) /** *
C#基礎系列:委託和設計模式(2)
前言:這篇打算從設計模式的角度去解析下委託的使用。我們知道使用委託可以實現物件行為(方法)的動態繫結,從而提高設計的靈活性。上次說過,方法可以理解為委託的例項,站在方法的層面,委託例項的一個非常有用的特性是它既不知道,也不關心其封裝方法所屬類的詳細資訊,對它來說最重
Android火車票訂購軟體之註冊和檔案儲存(2)
上次我們做了app啟動時的延時頁,這次我們來做登陸註冊的頁面。 xml程式碼: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.c
基於TensorFlow的Cats vs. Dogs(貓狗大戰)實現和詳解(2)
2. 卷積神經網路模型的構造——model.py 關於神經網路模型不想說太多,視訊中使用的模型是仿照TensorFlow的官方例程cifar-10的網路結構來寫的。就是兩個卷積層(每個卷積層後加一個池化層),兩個全連線層,最後一個softmax