我想让线程在特定的时间执行(例如:2012-07-11 13:12:24和2012-07-11 15:23:45)
我检查了ScheduledExecutorService
,但它只支持在第一次运行后的特定时间段后执行,而且我没有任何固定的时间段,而是我有时间从数据库执行任务。
在针对不同问题here的上一个问题中,TimerTask是解决方案,但显然我不能将TimerTask
作为Runnable
和TimerTask
两者都有需要实施的方法run
。这里的问题是,如果我使线程扩展TimerTask
并且有一个run()
的实现,那会有用吗?
如果没有,那么我怎么可能做我想做的事情?
答案 0 :(得分:13)
使用TimerTask。
使用字段变量作为线程创建TimerTask对象。 从Timer任务Run方法调用Thread start。
public class SampleTask extends TimerTask {
Thread myThreadObj;
SampleTask (Thread t){
this.myThreadObj=t;
}
public void run() {
myThreadObj.start();
}
}
像这样配置。
Timer timer new Timer();
Thread myThread= // Your thread
Calendar date = Calendar.getInstance();
date.set(
Calendar.DAY_OF_WEEK,
Calendar.SUNDAY
);
date.set(Calendar.HOUR, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
// Schedule to run every Sunday in midnight
timer.schedule(
new SampleTask (myThread),
date.getTime(),
1000 * 60 * 60 * 24 * 7
);
答案 1 :(得分:4)
我认为你应该更好地使用像Quartz Scheduler这样的库。这基本上是Java的cron实现。
答案 2 :(得分:1)
您是否从java.util.concurrent包中查看了CountDownLatch?它提供倒计时然后触发线程运行。我自己从不需要使用它,但已经使用了几次。