如何才能做到,定时启动某一个任务,比如三分钟做一次该任务,目前我用的是spring结合quartz实现了该功能
但是,我执行的那个任务的是多线程的,这样会导致什么问题呢,当三分钟到了会自动启动下一个任务,或许你会说concurrent可以控制,可是你错了,前几天我也这么天真的以为是,但是事实不是这样的。
我想达到的目的是,下一个任务的启动要看前面那个任务是否结束,而不会三分钟就起来一次,现在碰到的问题是当这个任务不是多线程时,是的会等待前面那个任务执行完毕,然后再起来,可是现在我想用多线程来实现这个任务,这条路还能走通吗?
或者是不是应该换其他的一种方法呢?
各位高手能不能给一点解决思路啊。
------------------------------------------------------------
这个问题已经解决了,感谢下我们同事达人,提供了点思路
package com.hundsun.mailBox.run;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.hsipcc.util.PropertyUtil;
/**
* 该自动服务入口类
*
*
*
*/
@Component
public class CycleSearch {
/**
* 该自动服务入口 函数
*
*/
private static final Logger logger = Logger.getLogger(CycleSearch.class);
public static int i = 0;//用来标识还在跑的线程数
public void doIt() {
if (i == 0) {//当线程为0的时候启动服务
// 16101服务
// EmlThread emlThread1 = new EmlThread("16101");
// Thread t1 = new Thread(emlThread1);
// 16009服务
// EmlThread emlThread2 = new EmlThread("16009");
// Thread t2 = new Thread(emlThread2);
// 16301服务
// EmlThread emlThread3 = new EmlThread("16301");
// Thread t3 = new Thread(emlThread3);
// t1.start();
// t2.start();
// t3.start();
// emlThread1.run();
// emlThread2.run();
// emlThread3.run();
ExecutorService exec = Executors.newFixedThreadPool(5);
String service_ids = "16009,16101,16301";
String service_id[] = service_ids.split(",");
for (int j = 0; j < service_id.length; j++) {
i++;
exec.execute(new EmlThread(service_id[j]));
}
} else {
logger.info("还有"+i+"个线程在跑请等待");
}
}
}
以前我把i--放那个doIt里面,后来发现没意义,因为这个不是循序执行的,在线程没跑完就做i--了
所以可以解释为什么concurrent好像是无效的,因为其实这个程序已经跑完了,只是线程还在跑,而他才不管这个呢,古下个三分钟到了任务就启动了,现在设置一个static变量i,标识进程数,如果不为0,说明没跑完,在每一个线程结束前来个CycleSearch.i--;,这也是为什么我设置i为public这也就达到了等待线程全部跑完的目的了
这里还有一个问题newFixedThreadPool的参数5是什么意思啊,如果service_id.length变大了写个5放哪里有影响吗?