Java Timer正在等待Task在下一个Task启动之前完成

时间:2016-01-19 12:18:24

标签: java asynchronous timer

我有这个简单的应用程序

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是否完成?

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

Timer使用单个线程。当您调用Thread.sleep(12000L);时,此线程被阻止,无法执行其他任务。尝试使用ScheduledExecutorService实现来使用更大的线程池。您可以使用以下命令创建一个简单的线程池:

java.util.concurrent.Executors.newScheduledThreadPool(corePoolSize)

答案 1 :(得分:2)

引用Javadoc

  

对应每个Timer对象是一个后台线程,用于按顺序执行所有计时器的任务。

如果您想要使用Timer描述的行为,则需要多个Timer个实例。