【问题标题】:java threading issue, right approach?java线程问题,正确的方法?
【发布时间】:2012-10-06 15:41:54
【问题描述】:

我正在创建一个将在后台持续运行的 java 服务,该服务的工作是在特定日期创建表的副本。确切地说,我从某个表中读取数据,如果表中的 record_date 与当前日期匹配,我需要创建表副本。然后服务应该休眠到下一个运行日期。下一次运行的日期也是通过查看表中的记录来确定的。

目前,我如何做到这一点,是创建一个在 while(true) 循环中运行的线程。并且当线程完成执行任务(即创建表副本)时,我使用 Thread.sleep() 让它进入睡眠状态,直到下次它需要运行。线程休眠的毫秒数,我通过取当前日期(线程执行任务的日期)和下一次运行日期之间的差异来计算。

这是正确的方法吗,在这种特殊情况下使用 thread.sleep() 是正确的吗?我这样说是因为线程的下一次运行日期可能在三个月甚至一年之后。如果我在这里不是很清楚,也请告诉我。

【问题讨论】:

  • 也许使用 wait() 和 notify()。
  • 我认为你的Thread.sleep(...)机制很好。
  • @jsn 我也想过,但问题是通知等待线程的内容,当当前日期等于record_date(来自db)时需要调用它。为了检测到该事件的发生,必须有一些连续的检查,至少每天一次。我更喜欢线程或进程休眠直到它需要实际执行并且不通过连续执行消耗系统资源的解决方案。
  • @wazzz 我明白了。但只是个人意见,如果你在线程中使用睡眠,你几乎总是在做错线程。
  • @jsn 我认为你是对的,这正是我问一个问题的原因。让我们看看我是否从某个可能不需要使用 sleep(...) 并且同时不需要连续执行的人那里得到解决方案:)

标签: java multithreading datediff


【解决方案1】:

如何剖析这两个操作?

  1. 编写一个 Java 作业,它在调用时检查表中的日期并创建一个副本。
  2. 安排 Java 作业以您希望的方式运行。

由于我们是 UNIX,所以cron 在执行此类任务时帮助我们很多。

【讨论】:

  • 感谢您的回复。在我的情况下,调度是动态的,日期必须来自数据库,然后确定最早可能的日期来运行该作业。如果不是这样,我可以使用 pgagent 作业调度程序。
  • 就像 SiB 说的,拆分操作,将任务的日常调用留给 cronjob。
【解决方案2】:

看看Lock interface。这是wait()notify() 的抽象,你应该使用它来代替sleep()

有一个answer here 说明了原因。

【讨论】:

  • 请参阅我上面对@jsn 评论的评论。
【解决方案3】:

查看 Java Timer API 或 Quartz 库

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多