当Java TimerTask在Timer中被调度时,它是否已经“执行”了?

2024-01-10

我想澄清一些关于 TimerTask 的事情。当你有下面的代码时:

timer.schedule(task, 60000);

如果任务计划在接下来的 1 分钟内运行,则任务对象是否已经在执行?

因为在我的代码中的某个地方我调用了 task.cancel() 但似乎该调用并没有阻止

要执行的任务。我什至记录了调用的返回值,它返回 false。

当我阅读取消方法的文档时,我提出了我的问题:

取消 TimerTask 并将其从 Timer 队列中删除。 通常,如果调用没有阻止 TimerTask,则返回 false 至少运行一次。后续调用没有任何效果。如果调用阻止了计划执行的发生,则返回 true,否则返回 false。

我相信我在 1 分钟延迟之前调用了 cancel() 。但为什么cancel返回false,

[任务] 已经在执行了吗?

希望您能给我线索/提示,甚至对此进行解释。谢谢!


  • 任务计划在接下来的 1 分钟内运行,任务对象是否已经在执行

不,它将调用run http://download.oracle.com/javase/6/docs/api/java/util/TimerTask.html#run%28%29方法在 60 秒内完成此任务。如果task.cancel()回报false,这可能意味着三件事:

  • 该任务被安排为一次性执行并且已经运行或
  • 该任务从未被安排或
  • 任务已取消或

因此,如果您确定您致电cancel在安排任务后 60 秒之前,您可能会多次调用它,并从后续任务中获取结果cancel,或者您正在对其他任务调用取消。


一般来说,我会建议反对Timer http://download.oracle.com/javase/6/docs/api/java/util/Timer.html赞成预定执行服务 http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html

您可以通过以下方式实现所需的功能:

ScheduledExecutorService.schedule(可调用,延迟,时间单位) http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#schedule%28java.util.concurrent.Callable,%20long,%20java.util.concurrent.TimeUnit%29

概述了 ScheduledExecutorService 成为首选方式的原因here https://stackoverflow.com/questions/409932/java-timer-vs-executorservice/409993#409993:

  • Timer 可能对系统时钟的变化敏感,而 ScheduledThreadPoolExecutor 则不然

  • Timer只有一个执行线程,因此长时间运行的任务会延迟其他任务。 ScheduledThreadPoolExecutor 可以配置任意数量的线程。此外,如果您愿意,您可以完全控制创建的线程(通过提供 ThreadFactory)

  • TimerTask 中抛出的运行时异常会杀死该线程,从而使 Timer 死亡:-( ...即计划任务将不再运行。ScheduledThreadExecutor 不仅捕获运行时异常,而且可以让您根据需要处理它们(通过覆盖来自的 afterExecute 方法) ThreadPoolExecutor). 抛出异常的任务将被取消,但其他任务将继续运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当Java TimerTask在Timer中被调度时,它是否已经“执行”了? 的相关文章

  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的

随机推荐