Re: [問題] 請問有辦法設定編號來決定排程嗎

看板java作者 (老子我最神)時間9年前 (2014/11/13 00:24), 9年前編輯推噓0(002)
留言2則, 2人參與, 最新討論串2/5 (看更多)
※ 引述《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
"pseudo code"
11/13 02:25, 1F
已修正 ※ 編輯: cyclone350 (123.193.192.133), 11/13/2014 02:34:57

11/13 11:19, , 2F
stream超好用的~我本來也是這樣想
11/13 11:19, 2F
文章代碼(AID): #1KOudNd0 (java)
討論串 (同標題文章)
文章代碼(AID): #1KOudNd0 (java)