我有一个 TimerTask ,用于按特定时间间隔收集指标。但是,任务执行的时间段可能少于任务执行的时间(有时会出现超时和延迟的情况)。
有没有办法同时执行多个TimerTasks或Runnables,线程等,而无需等待上一个任务完成?
我知道Timer使用单个线程, ScheduledThreadPoolExecutor 将延迟执行,无论速率如何。
感谢。
答案 0 :(得分:2)
我建议您使用Executors.newCachedThreadPool()
或newCachedThreadPool(ThreadFactory threadFactory)
与您自己的线程工厂一起使用Timer。所以代码看起来应该是这样的
Executor executor = Executors.newCachedThreadPool();
Timer time = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
executor.execute(new Runnable() {
public void run() {
//your business logic
}
});
}
}, delay, period);
通过这种方式,您可以安排具有一段时间的任务,并且它们将同时运行。
答案 1 :(得分:0)
使用任何Timer实现,包括ScheduledThreadPoolExecutor,但是让你的计时器任务不执行你的业务逻辑,而是快速启动另一个任务(到一个缓存的线程池,或者在它自己新创建的线程上),它实际上执行繁重的计算。