我有这个简单的应用程序
package testy;
import java.util.Timer;
import java.util.TimerTask;
import static testy.Test.log;
public class Test {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws InterruptedException {
Timer timer = new Timer(true);
log("tasks start");
timer.schedule(new Task1(), 1,120000);
timer.schedule(new Task2(), 3000,120000);
timer.schedule(new Task3(), 6000,120000);
Thread.sleep(99999999L);
}
static void log(String text) {
System.out.println(text);
}
}
class Task1 extends TimerTask {
@Override
public void run() {
log("Task1 start");
try {
Thread.sleep(12000L);
} catch (InterruptedException ex) {
log("interupted");
}
log("Task1 end");
}
}
class Task2 extends TimerTask {
@Override
public void run() {
log("Task2 start");
try {
Thread.sleep(12000L);
} catch (InterruptedException ex) {
log("interupted");
}
log("Task2 end");
}
}
class Task3 extends TimerTask {
@Override
public void run() {
log("Task3 start");
try {
Thread.sleep(12000L);
} catch (InterruptedException ex) {
log("interupted");
}
log("Task3 end");
}
}
从这段代码中我预计会立即触发Task1并在3秒后触发Task2(如延迟时间所示)。但是发生的事情是Task2正在等待Task1完成并在此之后立即被触发。 LOG:
tasks start
Task1 start
Task1 end
Task2 start
Task2 end
Task3 start
Task3 end
Task1 start
Task1 end
Task2 start
Task2 end
Task3 start
Task3 end
据我了解Java Timer,任务应该独立解雇。为什么这个应用程序的行为是不同的?如何在给定时间精确地启动任务,而不关心Timer1是否完成?
感谢您的帮助!
答案 0 :(得分:4)
Timer
使用单个线程。当您调用Thread.sleep(12000L);
时,此线程被阻止,无法执行其他任务。尝试使用ScheduledExecutorService
实现来使用更大的线程池。您可以使用以下命令创建一个简单的线程池:
java.util.concurrent.Executors.newScheduledThreadPool(corePoolSize)
答案 1 :(得分:2)