如果有线程依赖,线程池设计方法?

乌鸦哥 发布于 2013/07/08 00:21
阅读 269
收藏 0

场景是这样(类别):

有 add,query,update 三个命令单独执行时互相不依赖

1.执行add,query 就必须等所有的add命令执行完毕后才能执行query命令

2.执行add update,query 必须等所有的add命令完毕-update命令完毕-query命令

线程池的大小动态设置,add update为 记录数的1/2 query为记录数

现在的设计是采用java的 java.util.concurrent.Executors;import java.util.concurrent.Future;来实现,队列是有界队列

假设10条命令  add ,10条query

首先执行设置线程池大小为5,提交10条add命令道线程队列里

启动监控线程监控命令是否执行完毕(数据库是否有值),如果探测到10条add语句都执行完毕,就将query提交到线程队列中

线程库有提供future.get方法 查看执行结果,但是会阻塞,需要异步去触发query命令,所以才会有启动监控线程去增加新的命令

如果是 add -update -query 命令

就必须增加两个监控线程,首先提交add,监控线程探测执行完毕后心中 update命令

query监控线程执行queruy命令.

因为是线程依赖,如果其中有部分结果一直没返回,就会死锁,请教大家有没有什么好的设计

如果上面我写的不明白,简单说就是

有个任务给你,收集10个垃圾,然后杀了他们.马上反馈你是不是在做事

你:

1并发收集10个人信息,并马上返回我正在收集10个人的信息 (异步,多线程)

2.10个人信息收集完毕,执行杀人计划,拔5跟猴毛变成你去杀人(异步,5个线程)

3... 不断的通知你的老板现在到哪一步了

大概就是这样


加载中
0
IdleMan
IdleMan
可以考虑更高级的,写不阻塞读--类似数据库的回滚段
乌鸦哥
乌鸦哥
上面写的只是很简单的操作,可以有更多的组合,目前已知的命令有12个,互相都会依赖.今天改进了一下,不依赖数据库,起一个监控线程,动态创造 池,满足要求才进行 invokeAll ,同时检查当前活动的线程池是否执行完毕,完毕后在shutdown 确定 isTerminated 后,在启动新的线程 .昨晚啃了一晚上的并发编程实践,目前解决这个问题了
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部