java - 使 java.util.Timer 成为守护进程的正确方法

标签 java

我有以下 java.util.Timer 但它似乎没有执行,我也不知道为什么。

public static void main(String[] args)
{
  Timer to = new Timer(true);

  System.out.println("Now=" + System.currentTimeMillis());
  to.schedule(new TimeOutTask("Short#1 - 250"), 250);
  to.schedule(new TimeOutTask("Long - 10050"), 10050);
  to.schedule(new TimeOutTask("Short#2 - 250"), 250);
  to.schedule(new TimeOutTask("Medium - 5050"), 5050);
  to.schedule(new TimeOutTask("Short#3 - 250"), 250);
}

TimeOutTask 所做的只是打印传递的字符串和当前时间。当守护进程标志为 false 时,应用程序不会终止,我看到了:

Now=1297705592543
Short#1 - 250:1297705592793
Short#3 - 250:1297705592793
Short#2 - 250:1297705592793
Medium - 5050:1297705597605
Long - 10050:1297705602605

当为 true 时应用程序终止并且我看到了这个:

Now=1297705249422

我只是想找到一种方法来监控多个任务是否超时;我不希望监视超时的线程阻止应用程序终止。所以我想要守护进程,但是当我将它设为守护进程时,我的任务似乎都没有执行?!?!

编辑:

有趣的是,我认为我的问题源于我孤立地尝试新想法的方式。如果我有一个真正的应用程序在运行,它将使守护线程保持 Activity 状态,并且由于这些线程仅代表超时,所以我不关心它们是否在主应用程序完成时完成。

我将此代码添加到我的主要方法的末尾以弹出一个框架并通过在不同时间关闭它来进行测试。如果我等待的时间足够长,我的所有线程都会执行,否则即使某些任务尚未执行,应用程序也会正常终止。

JFrame f = new JFrame("Test Frame");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.setVisible(true);

感谢您的帮助。

最佳答案

当您将其设置为守护线程时,您的主线程会在安排计时器后立即结束,并且没有什么可以阻止应用程序退出。您需要下定决心:要么让计时器线程让应用程序保持 Activity 状态,要么不要。你不能两全其美:)

如果您想让它保持 Activity 状态的时间刚好足以让所有计划任务完成,则可以添加一个额外的计划任务来停止计时器,将其安排在最新任务之后。

关于java - 使 java.util.Timer 成为守护进程的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4995505/

相关文章:

java - 基于条件的 Jackson JSON 日期格式序列化

java - 使用 Junit 测试抛出异常的方法

java - 我应该使用 EnumSet 吗?

java - 智能横幅加载至全屏尺寸

java - 使用 GIT 的 IDEA 新 gradle spring boot 项目。正确的创建顺序是什么?

java - 找不到jar库

java - 将 cmd 的输出重定向到文件

java - 使用隐式 Intent 过滤器时如何绕过 Complete Action Using 菜单?

java - 如何在不递归的情况下获得范围内的斐波那契数列

java - 使用 CMS GC 时,Tomcat 6 连接池变得古怪