关于TimerTask的问题

ipromise_u 2012-08-28 10:49:11
如今有这样一种情况,有一些屏蔽时间 比如 0000-0800 ,1400-1700 屏蔽时间内不执行输出,屏蔽时间每天都如此,请帮忙给一个好的处理方式,我自己写的那个有问题.
...全文
171 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ipromise_u 2012-09-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
引用 13 楼 的回复:

恩 上面的就是你说的那种情况 正在吃饭中 cancel 是没用的,但现在要做的就是cancel ,用标识应该也是一种不错的解决方法,我试试看啊,先谢谢你了


加油! 我看好你哦。 解决了别忘了结贴哦~~ 谢谢:)
[/Quote]
恩 很早以前已经解决,谢谢,分全给你了
scbb 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
说下我的做法,
屏蔽时间0000,1400 到的时候去停止所有的order ,0800,1700,去开启所有的order
for (int i = 0; i < 4; i++) {
String s = String.valueOf(minute++);
String e = String.valueOf(minute++);
op(date + "" + e, date + "" + s);
}
请参考这个循环
[/Quote]

你说说你这样做,碰到什么困难吧?
你说你写的有问题,是什么问题呢??
ipromise_u 2012-08-28
  • 打赏
  • 举报
回复
start 与 end 都为多个 以时间添加
ipromise_u 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 1 楼 的回复:

还是上一下我的代码,有问题的,因为任务有多个,需要同时进行,所以不能只用一个timer




你的意思Start要多个? ex();2次就有2个Start的对象了。
还是类似Start 的task有多个? task种类多个,那么把Task作为参数传给TestTask,
而不是在op里new。

不过我猜我没搞清楚楼主到底需要什么。。。。:)
[/Quote]


说下我的做法,
屏蔽时间0000,1400 到的时候去停止所有的order ,0800,1700,去开启所有的order
for (int i = 0; i < 4; i++) {
String s = String.valueOf(minute++);
String e = String.valueOf(minute++);
op(date + "" + e, date + "" + s);
}
请参考这个循环
scbb 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

还是上一下我的代码,有问题的,因为任务有多个,需要同时进行,所以不能只用一个timer


[/Quote]

你的意思Start要多个? ex();2次就有2个Start的对象了。
还是类似Start 的task有多个? task种类多个,那么把Task作为参数传给TestTask,
而不是在op里new。

不过我猜我没搞清楚楼主到底需要什么。。。。:)
ipromise_u 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
用Quartz,java的计划任务。
百度一下一大把。 可以写很多格式,定义每天还是每周执行。
每天什么时候执行等。
[/Quote]

这个项目不用QUARTZ 改起来会比这更麻烦
scbb 2012-08-28
  • 打赏
  • 举报
回复
用Quartz,java的计划任务。
百度一下一大把。 可以写很多格式,定义每天还是每周执行。
每天什么时候执行等。
ipromise_u 2012-08-28
  • 打赏
  • 举报
回复
具体任务order 在endtask的执行的时候会停掉,但并没有停掉starttask 所以还会继续添加,但这个starttask 又不能停掉,所以不知道怎么处理好了,请帮忙给个更好的思路
ipromise_u 2012-08-28
  • 打赏
  • 举报
回复
还是上一下我的代码,有问题的,因为任务有多个,需要同时进行,所以不能只用一个timer

package com;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Timer;

public class TestTask {

static List<Timer> stimers = new ArrayList<Timer>();
static List<Timer> etimers = new ArrayList<Timer>();
static List<Timer> timers = new ArrayList<Timer>();

/**
* @param args
*/
public static void main(String[] args) {
try {
ex();
} catch (Exception e) {
e.printStackTrace();
}
}

public static void ex() throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
Calendar c = Calendar.getInstance();
c.setTime(new Date());
int year = c.get(Calendar.YEAR);
String month = (c.get(Calendar.MONTH) + 1) < 10 ? ("0" + (c
.get(Calendar.MONTH) + 1)) : ""
+ (c.get(Calendar.MONTH) + 1);
int day = c.get(Calendar.DAY_OF_MONTH);
String hour = c.get(Calendar.HOUR) < 10 ? ("0" + (c
.get(Calendar.HOUR))) : "" + c.get(Calendar.HOUR);
int minute = c.get(Calendar.MINUTE);
String date = year + "" + month + "" + day + "" + hour;
for (int i = 0; i < 4; i++) {
String s = String.valueOf(minute++);
String e = String.valueOf(minute++);
op(date + "" + e, date + "" + s);
}
}

public static void op(String sdate, String edate) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");

End ed = new End();
Timer etimer = new Timer();
etimer.schedule(ed, new Date(sdf.parse(edate).getTime()),
24 * 6 * 1000 * 60);
etimers.add(etimer);

Start st = new Start();
Timer stimer = new Timer();
stimer.schedule(st, new Date(sdf.parse(sdate).getTime()),
24 * 6 * 1000 * 60);
stimers.add(stimer);
}

}



package com;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Start extends TimerTask {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");

@Override
public void run() {
try {
Order order = new Order();
Timer timer = new Timer();
timer.schedule(order,
new Date(sdf.parse("201208211521").getTime()),
24 * 6 * 1000 * 60);
TestTask.timers.add(timer);
} catch (Exception e) {
e.printStackTrace();
}
}

}





package com;

import java.util.Timer;
import java.util.TimerTask;

public class End extends TimerTask {

@Override
public void run() {
System.out.println("end cancel all order task "+ TestTask.timers.size());
for (Timer timer : TestTask.timers) {
timer.cancel();
}
}

}




package com;

import java.util.TimerTask;

public class Order extends TimerTask {

@Override
public void run() {
try {
for (int i = 0; i < 100000; i++) {
System.out.println("sleep 1s ");
Thread.sleep(1000);
}
} catch (Exception e) {
// TODO: handle exception
}
}

}



scbb 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

恩 上面的就是你说的那种情况 正在吃饭中 cancel 是没用的,但现在要做的就是cancel ,用标识应该也是一种不错的解决方法,我试试看啊,先谢谢你了
[/Quote]

加油! 我看好你哦。 解决了别忘了结贴哦~~ 谢谢:)
ipromise_u 2012-08-28
  • 打赏
  • 举报
回复
恩 上面的就是你说的那种情况 正在吃饭中 cancel 是没用的,但现在要做的就是cancel ,用标识应该也是一种不错的解决方法,我试试看啊,先谢谢你了
scbb 2012-08-28
  • 打赏
  • 举报
回复
Timer
public void schedule(TimerTask task,
Date firstTime,
long period)
指开始firstTime,后每个period作一次。
而cancel是指,每过period,不做了。
但是当前还在处理的作业不会停止。
例如:
你每过1小时吃1次饭。 然后cancel了。 下一个小时不吃了。
但是要是cancel时你正在吃饭,那么你还会把现在这顿吃完。

你的代码你把Order里的循环次数改小点试试看,比如10。
如果你想Order里,当前处理也要立刻终止。 那么你可以置个标志位表示结束了。
然后判断这个标志位立刻throw 一个中断的Exception。

ipromise_u 2012-08-28
  • 打赏
  • 举报
回复
自己试试可以不可以
scbb 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 8 楼 的回复:
引用 6 楼 的回复:
说下我的做法,
屏蔽时间0000,1400 到的时候去停止所有的order ,0800,1700,去开启所有的order
for (int i = 0; i < 4; i++) {
String s = String.valueOf(minute++);
String e = String.valueOf(minute++);
op……
[/Quote]

cancel()应该可以用。 你说的无用?
ipromise_u 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 6 楼 的回复:
说下我的做法,
屏蔽时间0000,1400 到的时候去停止所有的order ,0800,1700,去开启所有的order
for (int i = 0; i < 4; i++) {
String s = String.valueOf(minute++);
String e = String.valueOf(minute++);
op(date + "" + e,……
[/Quote]

canle() 无用,我已经换了另外一种方法 ,ScheduledFuture 这个类,你如果有兴趣也可以瞧瞧.

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧