首页 新闻 搜索 专区 学院

java 定时器 判断定时器内的内容是否执行完毕

0
悬赏园豆:80 [已解决问题] 解决于 2017-09-07 10:55

java  定时器 判断定时器内的内容是否执行完毕 ,执行完毕的还是按原来是时间定时更新,假如没有更新完毕,定时器的时间加大,当执行完毕重新开始按定时器之前的时间更新

爱学习,爱劳动的主页 爱学习,爱劳动 | 初学一级 | 园豆:115
提问于:2017-09-06 15:35
< >
分享
最佳答案
1

我这么处理过,加个状态,正在运行就略过本次定时任务。

public class TestTimer extends TimerTask{
private boolean isRun = false;
private int icount = 0;//定时划分细一些(如10次才是真正的一个任务),略过后等待是接近完整的周期。不加这样的判断定时器触发时间是固定的;加上就是基本按上一次完成时来定间隔周期。


public void run() {
if(isRun) return;//正在运行,略过本次
if(++icount<10) return;//时间粒度是10
try {
icount = 0;
isRun = true;
runTask();
} catch (Exception e) {
e.printStackTrace();
}finally{
isRun = false;
}
}

private void runTask(){
//Task
}
}

收获园豆:40
X听雨 | 菜鸟二级 |园豆:305 | 2017-09-06 16:56

我用的是quartz  这个定时器,我现在方法结束时  返回success  这样可以吗?  

test.insert(sql1);
if(state.equals("SUCCESS")){
String time = "5";
realTime.startInsertGPS(time);
}else{
String time = "5+"+timeNum+"";
timeNum=timeNum+5;
realTime.startInsertGPS(time);
}

我是这样判断的  可以吗

爱学习,爱劳动 | 园豆:115 (初学一级) | 2017-09-06 17:16

我这样不行  虽然可以加大定时器的时间,但是没执行完的话,他一直调用定时方法

爱学习,爱劳动 | 园豆:115 (初学一级) | 2017-09-06 17:25

@爱学习,爱劳动:

没有使用过这个定时器,不过不应该使用返回值来判断,正在运行的应该是没有返回值的吧?

应该是进入任务时置个标志,任务完成时才释放,下次任务先判断标志,正在运行的状态就略过本次任务。

X听雨 | 园豆:305 (菜鸟二级) | 2017-09-06 17:28

@爱学习,爱劳动: 你可以给个完整点的代码来看看

X听雨 | 园豆:305 (菜鸟二级) | 2017-09-06 17:31

@X听雨: 

@Service
public class TestInsert {
@Autowired
private CommonDao dao;

public String insert(String sql){

for(int i=0;i<10;i++){
for(int j=0;j<50;j++){
System.out.println("---------------------------"+i);
System.out.println("sql语句"+sql);
}
return "ERROR";
}
return "SUCCESS";
}

 

 

给点好建议 这是个模型  大概就是个这意思

爱学习,爱劳动 | 园豆:115 (初学一级) | 2017-09-06 18:13

@X听雨: 这个够吗?还是把用的类的方法都贴出来

爱学习,爱劳动 | 园豆:115 (初学一级) | 2017-09-06 18:26

@爱学习,爱劳动: 不清楚你具体的逻辑,如果返回error可以在下次再被调用的话,大概可以这么写

private static boolean isRuning = false;
public String insert(String sql){
if(isRuning) return "ERROR";
try {
isRuning = true;
//do some thing
return "ERROR";
} catch (Exception e) {
e.printStackTrace();
}finally{
isRuning = false;
}
return "SUCCESS";
}

X听雨 | 园豆:305 (菜鸟二级) | 2017-09-07 09:20
其他回答(2)
0

一般都是通过日志打印
譬如run方法里面加入以下

log.info("定时器启动,时间:"+new Date())
try{

}catch(){
log.error("出现异常")

return;

}
log.info("定时器结束,时间:"+new Date())
当日志打印有结束语句就证明跑完了

收获园豆:40
金琥 | 园豆:2570 (老鸟四级) | 2017-09-07 10:01
0

谢谢大家  我找到答案了   我使用quartz 定时器  在job中实现StatefulJob接口 就可以实现  当这个任务job没有结束时 不会重新启动该任务job

爱学习,爱劳动 | 园豆:115 (初学一级) | 2017-09-07 10:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册