java如何在线程池中做任务之间的依赖

青离 发布于 2015/08/20 11:40
阅读 616
收藏 1
现在我们已经在做一个线程池下的任务定时执行的项目。主要是通过quartz定时提交任务到线程池中去执行,线程池使用的是java的ThreadPoolExcutor,任务是通过前台页面提交任务执行的sql。目前有一个新的需求,任务与任务间有了依赖的关系,怎么能保证一个任务执行前它依赖的其他任务都已经执行了呢?
加载中
0
CoserSeu
CoserSeu

既然任务之间有依赖,把有依赖关系的任务放到一个线程中不就好了?

CoserSeu
CoserSeu
回复 @青离 : 那就用Future变量来监控线程执行的状态。
青离
青离
一个基础任务可能有多个任务去依赖它
0
景愿
景愿

1.放在同一线程同步执行

2.使用状态来标识处理任务完成,至于放内存还是数据库,你自己看

景愿
景愿
回复 @青离 : A执行异常B你觉得还有必要轮询吗,当然是要报警提示出错,如果觉得性能影响,轮询间隔加大一点,如果是小系统,在一个线程执行拉到
青离
青离
任务B中通过轮询标示来确定被依赖的基础任务A是否执行完成了吗?如果被依赖的基础任务A出现异常,那任务B所在线程不就出现死循环了吗?还是要设置轮询最长等待时间来解决这个问题。因为现在做的这个是通用的,轮询的时间间隔和轮训最长等待时间很不好确定。
0
东胜神洲
东胜神洲

如果确实需要任务依赖,可以有很多方法。。例如 建立通信机制。。

如果是普遍存在的情况,可以参考 JDK7 或以上版本自带的 Fork/Join 并行计算框架。。

基本上都是基于消息通信机制的处理方法。。例如,A 出现异常,异常是可以捕捉的,然后向外发布消息,任务B 侦听消息,根据不同消息进行不同处理。。


0
VictoryKin
VictoryKin

CountDownLatch 如果你之前的都执行完了 减一不就行了么

http://blog.csdn.net/hikvision_java_gyh/article/details/9953691

0
Grrrr
Grrrr

我曾经搞过这个东西,主要是解决分布式任务调度的。和你的场景一模一样。只不过是分布式的。

解决依赖关系有很多种做法,我用的是DAG拓扑解法,把整个任务(Job)看成一个有向无环图,节点就是含有依赖关系的逻辑任务(Task)。然后对这个图进行拓扑排序(序列不唯一)

如图:

比如一个Job包含4个逻辑Task(A,B,C,D)。那么拓扑的序列为:(a->b->c->d或a->c->b->d)其中b,c可以并发执行。

这个算法的好处是可以将任意复杂的依赖任务抽象成DAG,拓扑算法会帮你梳理好依赖,并且告诉你哪些可以并发计算,哪些任务是坏任务(有环)

可以参考我以前写的一个帖子 http://www.oschina.net/question/147822_153289

用lua写的,你可以改造成java版本的。

最后友情提示下:还有依赖关系的任务,事务回滚要好好想一下。(因为涉及到并发执行的任务)

0
海棠
海棠
我们的工程里面刚好有个类似的功能,是将所有任务状态放在内存中,每次扫描任务列表的时候都去检索它的上个任务是否执行完,然后再去执行,执行完一个线程一定要修改这个任务在内存中的状态
0
朱宏青
朱宏青

如果只是提交SQL执行 建议直接做一个批量任务提交入口 上传一个SQL文本直接跑 

当然你要说你的系统足够复杂,好多个库什么的 那你看着办吧... 

返回顶部
顶部