问题描述
如何才能做到,定时启动某一个任务,比如三分钟做一次该任务,目前我用的是spring结合quartz实现了该功能但是,我执行的那个任务的是多线程的,这样会导致什么问题呢,当三分钟到了会自动启动下一个任务,或许你会说concurrent可以控制,可是你错了,前几天我也这么天真的以为是,但是事实不是这样的。我想达到的目的是,下一个任务的启动要看前面那个任务是否结束,而不会三分钟就起来一次,现在碰到的问题是当这个任务不是多线程时,是的会等待前面那个任务执行完毕,然后再起来,可是现在我想用多线程来实现这个任务,这条路还能走通吗?或者是不是应该换其他的一种方法呢?各位高手能不能给一点解决思路啊。
解决方案
解决方案二:
concurrent真的不行么?你的concurrent是怎么用的?试试java.util.concurrent.Semaphore
解决方案三:
楼主说的实际上是多线程的异步执行。如果你需要在web中加载,最简单的可以写一个servlet在web.xml配置为自动加载(或者直接使用监听器listener)加载这个servlet时,你可以用一个timer来每个3分钟启动一个线程,注意!timer要干的事就是每隔3分钟new一个新的线程。如果需要在线程中访问业务层,可以用spring直接注入的:ContextLoaderListener.getCurrentWebApplicationContext().getBean(***Service.class);spring结合quartz应该也能做到异步执行,不过我也不懂,帮顶。
解决方案四:
个人觉得你还是调整定时时间然后加上标示位当每个线程执行完成后设置标示位当下次定时任务启动时判断这些标示位是否都已经完成完成了就开始新一轮任务并重置标示也可以写一个守护线程去监听每个线程的执行情况
解决方案五:
quartz可以设置线程数量,设置成单线程就行了(不过我说的是单独用quartz,整合的不知道有没有)
解决方案六:
设置成单线程楼主就不会在这问了。。。引用4楼soli11722984的回复:
quartz可以设置线程数量,设置成单线程就行了(不过我说的是单独用quartz,整合的不知道有没有)
解决方案七:
设置一个静态变量,在一个任务开始时改变它为false,当结束时设为true,然后在另个线程里判断这个变量,若为false则继续sleep
解决方案八:
可不可以弄一个类似于线程锁的东西?然后还有一个排队标识
解决方案九:
引用5楼ticmy的回复:
设置成单线程楼主就不会在这问了。。。引用4楼soli11722984的回复:quartz可以设置线程数量,设置成单线程就行了(不过我说的是单独用quartz,整合的不知道有没有)
那个单线程是quartz的单线程,不是他要做的事变成单线程,而且quartz还有个有状态JOB,可以记录上一次执行的状态,所以不管你JOB里面是多线程还是单线程工作,quartz还是会排队执行(因为设成单线程了)