我有一个TimerTask,旨在以特定时间间隔收集指标。但是,任务执行的周期可能小于任务执行的时间(有时如果某些事情超时并被延迟)。
有没有办法在不等待前一个任务完成的情况下同时执行多个 TimerTasks 或 Runnables、线程等?
我知道 Timer 使用单个线程,无论速率如何,ScheduledThreadPoolExecutor都会延迟执行。
谢谢。
我有一个TimerTask,旨在以特定时间间隔收集指标。但是,任务执行的周期可能小于任务执行的时间(有时如果某些事情超时并被延迟)。
有没有办法在不等待前一个任务完成的情况下同时执行多个 TimerTasks 或 Runnables、线程等?
我知道 Timer 使用单个线程,无论速率如何,ScheduledThreadPoolExecutor都会延迟执行。
谢谢。
我建议您使用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);
这样,您可以在某个时间段内安排任务,并且它们都将同时运行。
使用任何 Timer 实现,包括 ScheduledThreadPoolExecutor,但让您的计时器任务不执行您的业务逻辑,而是快速启动另一个实际执行大量计算的任务(到缓存的线程池,或在它自己新创建的线程上)。