Re: [問題] 請問有辦法設定編號來決定排程嗎
※ 引述《PTTCATKING (懷念美國貓王)》之銘言:
: 標題: [問題] 請問有辦法設定編號來決定排程嗎
: 時間: Wed Nov 12 14:45:46 2014
:
: 假設有二十個任務要跑
:
: 而他在DB裡會有兩組編號(欄位名稱)
:
: 第一組是1~20的流水號
:
: 第二組是執行優先順序(記錄需等待的對象)
:
: A 跑完 同時執行 B & CD 兩條線同時跑,而B會先跑完,但要等CD都跑完後,BCD都結束
: 才開始跑E
:
: A的編號就是 1 0 (無等待對象)
:
: B的編號就是 2 1 (等待A,1是A的編號)
:
: C的編號就是 3 1 (等待A,1是A的編號)
:
: D的編號就是 4 3 (等待C,3是C的編號)
:
: E的編號就是 5 2 (等待B,2是B的編號)
:
: E的編號就是 5 4 (等待D,4是D的編號)
:
: 因為E要等兩個,所以在DB裡 E 會有兩筆資料
:
:
: 請問 有沒有什麼現有套件有能夠執行這件事情呢
:
: 設定那兩個編號,則程式執行後就按照兩個編號,決定程式優先順序,並有可能同時執行
: 多程序
:
: 以後維護就是設定編號就能決定跑程式的優先順序
:
:
: 今天用CountDownLatch寫出類似的東西,被認為是寫死的東西orz
:
: 這是用排程器???或是什麼方向呢?? @O@
:
: 能否有高手指點明燈給我方向,謝謝 T_T
:
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.66.159.143
: ※ 文章網址: http://www.ptt.cc/bbs/java/M.1415774748.A.B71.html
: → swpoker: 我想是你程式寫法的問題~先把你CODE放上來吧 11/12 14:53
:
: final CountDownLatch beginA = new CountDownLatch(1);
: final CountDownLatch end = new CountDownLatch(2);
: final CountDownLatch endE = new CountDownLatch(1);
: final ExecutorService exec = Executors.newFixedThreadPool(3);
: ※ 編輯: PTTCATKING (42.66.159.143), 11/12/2014 14:59:15
:
: 這樣寫大概就是 A跑完後開始跑 B跟C ,C跑完跑D ,BCD都跑完最後才跑E
:
: 只是實際上的需求是要用資料庫裡 兩個編號來決定優先順序
:
: 而修改第兩個編號可能每隻程式的執行順序就會改變
我不知道什麼是 CountDownLatch, 也不清楚 ExecutorService
但是也許可以講一下要如何做出更動態的程式
先假設你的 CountDownLatch 與 ExecutorService 理解沒有錯誤
以這個例子來講解
也許會對你有幫助
第一步,先想想你的api要呼叫,先不要管實作,只要考慮怎麼呼叫就好
然後定出 interface。
就以你這個例子,我希望我的 api 會是這樣呼叫
public class MyProcess {
public void process() {
ExecutorService exec = ExecutorServiceBuilder
.addProcess(A.class)
.waitToGo(B.class, "A")
.waitToGo(C.class, "A")
.waitToGo(D.class, "C")
.waitToGo(E.class, "D", "B")
.build();
exec.submitAll();
}
}
// 以上程式碼頂多算pseudo code
接下來就是根據每個 method 去實作它,這樣不管在怎麼不彈性,在怎麼死
對使用 api 的人來講都是夠彈性的,假設你後來真的找到一個已經存在 lib 有此功能
也可以把 ExecutorServiceBuilder 當成是 lib 的一個 adapt 或是 proxy
以上只是舉例,事實上實作時也不一定要用 ExecutorService。
假設你是要用 CountDownLatch 來做的話
CountDownLatch 的值改成 method input 的值就好
例如
public ExecutorServiceBuilder waitToGo(Class runner, String... waitNames)
throws Exeception {
registerName(runner); //註冊名稱
checkValid(waitNames); // 檢查等待的名稱是否正確,若錯誤則噴 Exeception
updateCountDownValue(waitNames); // 把每一種 countDownLatch 值更新
}
類似這樣...
把要做的事情都寫出來,最後在一個一個獨立出來實作
不知道有沒有幫助... 我猜應該沒甚麼幫助 XD
:
: 跪求神手指點名燈 T_T
: ※ 編輯: PTTCATKING (42.66.159.143), 11/12/2014 17:40:05
: → ssccg: 有一定要先開跑再wait再那邊的理由嗎? 11/12 20:12
: → ssccg: 前一個跑完後select出所有該接它後面跑的來跑不行? 11/12 20:14
: 推 yyc1217: 有點類似無限狀態機(FSM)的感覺 11/12 21:06
: → yyc1217: 另外用一個singleton的manager來做state之間的管理? 11/12 21:07
: → luoqr: 跑完的去通知在等他的那些人開動不行嗎? :S 11/12 21:24
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.193.192.133
※ 文章網址: http://www.ptt.cc/bbs/java/M.1415809495.A.9C0.html
→
11/13 02:25, , 1F
11/13 02:25, 1F
已修正
※ 編輯: cyclone350 (123.193.192.133), 11/13/2014 02:34:57
→
11/13 11:19, , 2F
11/13 11:19, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 5 篇):