我希望在调用printFirst()
方法之前有1分钟的延迟,而不影响主线程。
代码
我试过了
// define delaying print-method using Timer
static void printFirst() {
new java.util.Timer().schedule(
new java.util.TimerTask() {
public void run() {
System.out.println(ts() + " First");
}
},60000
);
}
// main to run
System.out.println(ts() + " Zero");
printFirst();
printFirst();
printFirst();
System.out.println(ts() + " Second");
System.out.println(ts() + " Third");
System.out.println(ts() + " Fourth");
实际输出
但结果是
Timestamp: 2023-01-05 17:40:43.664 Zero
Timestamp: 2023-01-05 17:40:43.666 Second
Timestamp: 2023-01-05 17:40:43.667 Third
Timestamp: 2023-01-05 17:40:43.667 Fourth
Timestamp: 2023-01-05 17:41:13.681 First
Timestamp: 2023-01-05 17:41:13.681 First
Timestamp: 2023-01-05 17:41:13.681 First
预期
我原以为以"第一"结尾的3行之间会有1分钟的间隔。
Timestamp: 2023-01-05 17:40:43.664 Zero
Timestamp: 2023-01-05 17:40:43.666 Second
Timestamp: 2023-01-05 17:40:43.667 Third
Timestamp: 2023-01-05 17:40:43.667 Fourth
Timestamp: 2023-01-05 17:41:43.667 First
Timestamp: 2023-01-05 17:42:43.667 First
Timestamp: 2023-01-05 17:43:43.667 First
4条答案
按热度按时间eqoofvh91#
我们可以通过使用ExecutorService类和newSingleThreadExecutor()方法来实现预期的结果。
主要方法仍然相同。
运行时,结果为:
dgenwo3n2#
作为一个选项,您可以设置定时器以定期执行并限制运行次数
然后使用一个命令
printFirst(60000, 3);
运行它7bsow1i63#
问题
您的
Timer.schedule(TimerTask task, long initialDelay)
中的延迟仅为初始延迟,即计划任务和任务开始之间的时间。请参见文档中的参数:delay
-执行任务之前的延迟(毫秒)。溶液
对于您的意图-如interval-您需要重载的姊妹方法
schedule(TimerTask task, long delay, long period)
将1分钟间隔作为第三个参数传递给名为period
的参数:安排指定任务在指定的延迟后开始重复执行,并保持固定延迟。后续执行大约以**固定间隔进行,间隔由指定的
period
**分隔。注意:在你的代码中,
printFirst
被调用了3次。大概是为了启动3个不同的任务或者打印3行。任务调度何时结束?
这里的
printScheduledWithInterval
更确切地说是指调度一个打印作业以固定的时间间隔重复执行。由于没有打印行数或最大执行计数的要求,定时器将不断启动新任务。
6uxekuva4#
调用函数时,可以将秒数设置为参数
在你的工作中,