作者cyclone350 (老子我最神)
看板java
标题Re: [问题] 请问有办法设定编号来决定排程吗
时间Thu Nov 13 00:24:52 2014
※ 引述《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://webptt.com/cn.aspx?n=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://webptt.com/cn.aspx?n=bbs/java/M.1415809495.A.9C0.html
1F:→ NewSpec: "pseudo code" 11/13 02:25
已修正
※ 编辑: cyclone350 (123.193.192.133), 11/13/2014 02:34:57
2F:→ swpoker: stream超好用的~我本来也是这样想 11/13 11:19