Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java线程问题,正确的方法?_Java_Multithreading_Datediff - Fatal编程技术网

java线程问题,正确的方法?

java线程问题,正确的方法?,java,multithreading,datediff,Java,Multithreading,Datediff,我正在创建一个java服务,它将在后台持续运行,该服务的任务是在特定日期创建表的副本。确切地说,我从一些表中读取数据,如果表中的记录日期与当前日期匹配,我需要创建表副本。然后,服务应该一直休眠到下一个运行日期。下一个运行日期也是通过查看表中的记录来确定的 目前,我要做的是创建一个在while(true)循环中运行的线程。当线程完成任务(即创建表副本)后,我使用thread.sleep()将其置于睡眠状态,直到下次需要运行它。线程睡眠的毫秒数,我通过取当前日期(线程执行任务的日期)和下一个运行日期

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

目前,我要做的是创建一个在while(true)循环中运行的线程。当线程完成任务(即创建表副本)后,我使用thread.sleep()将其置于睡眠状态,直到下次需要运行它。线程睡眠的毫秒数,我通过取当前日期(线程执行任务的日期)和下一个运行日期之间的差来计算


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

两个手术的解剖情况如何?

  • 编写一个Java作业,调用该作业时检查表中的日期并创建一个副本
  • 安排java作业按您希望的方式运行
  • 因为我们UNIX所以
    cron
    在执行这些任务时帮助了我们很多。

    请看一下。这是对
    wait()
    notify()
    的抽象,您应该使用它来代替
    sleep()


    有一个例子说明了原因。

    检查Java定时器API或Quartz库

    可能使用wait()和notify()。我认为你的
    线程睡眠(…)
    机制很好。@jsn我也想到了,但问题是什么通知等待的线程,当当前日期等于record\u date(来自db)时需要调用它. 要检测到事件的发生,必须有一些东西在不断地检查,至少每天检查一次。我更喜欢这样一种解决方案:线程或进程在需要实际执行之前处于休眠状态,而不是通过持续执行来消耗系统资源。@wazzz我明白了。但是我个人的看法是,如果你使用睡眠线程,你几乎总是做错误的线程。@jsn我再次认为你是对的,这正是我问问题的原因。让我们看看是否有人提供了一个解决方案,它可能不需要使用睡眠(…),同时也不需要连续执行:)感谢您的回复。在我的例子中,调度是动态的,日期必须来自db,然后确定运行作业的最早日期。如果不是这样的话,我可以使用pgagent作业调度器。如SiB所说,拆分操作,将每天调用任务的任务留给cronjob。请参阅上面我对@jsn comment的评论。