gpt4 book ai didi

Java 计时器在下一个任务开始之前等待任务完成

转载 作者:行者123 更新时间:2023-12-01 07:52:36 27 4
gpt4 key购买 nike

我有这个简单的应用程序

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 将立即被触发,而 Task2 将在 3 秒后被触发(如延迟时间所示)。但发生的情况是 Task2 正在等待 Task1 完成并在完成后立即被触发。日志:

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计时器,任务应该独立触发。那么为什么这个应用程序的行为不同呢?如何在给定的时间精确地完成启动任务,而不关心Timer1是否完成?

感谢您的帮助!

最佳答案

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

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

关于Java 计时器在下一个任务开始之前等待任务完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34876639/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com