java线程问题,正确的方法?
我正在创建一个java服务,它将在后台持续运行,该服务的任务是在特定日期创建表的副本。确切地说,我从一些表中读取数据,如果表中的记录日期与当前日期匹配,我需要创建表副本。然后,服务应该一直休眠到下一个运行日期。下一个运行日期也是通过查看表中的记录来确定的 目前,我要做的是创建一个在while(true)循环中运行的线程。当线程完成任务(即创建表副本)后,我使用thread.sleep()将其置于睡眠状态,直到下次需要运行它。线程睡眠的毫秒数,我通过取当前日期(线程执行任务的日期)和下一个运行日期之间的差来计算java线程问题,正确的方法?,java,multithreading,datediff,Java,Multithreading,Datediff,我正在创建一个java服务,它将在后台持续运行,该服务的任务是在特定日期创建表的副本。确切地说,我从一些表中读取数据,如果表中的记录日期与当前日期匹配,我需要创建表副本。然后,服务应该一直休眠到下一个运行日期。下一个运行日期也是通过查看表中的记录来确定的 目前,我要做的是创建一个在while(true)循环中运行的线程。当线程完成任务(即创建表副本)后,我使用thread.sleep()将其置于睡眠状态,直到下次需要运行它。线程睡眠的毫秒数,我通过取当前日期(线程执行任务的日期)和下一个运行日期
这是正确的方法吗?在这个特定场景中使用thread.sleep()是正确的吗?我这样说是因为线程的下一个运行日期可能在三个月甚至一年之后。如果我不太清楚,也请告诉我。两个手术的解剖情况如何?
cron
在执行这些任务时帮助了我们很多。请看一下。这是对wait()
和notify()
的抽象,您应该使用它来代替sleep()
有一个例子说明了原因。检查Java定时器API或Quartz库可能使用wait()和notify()。我认为你的
线程睡眠(…)
机制很好。@jsn我也想到了,但问题是什么通知等待的线程,当当前日期等于record\u date(来自db)时需要调用它. 要检测到事件的发生,必须有一些东西在不断地检查,至少每天检查一次。我更喜欢这样一种解决方案:线程或进程在需要实际执行之前处于休眠状态,而不是通过持续执行来消耗系统资源。@wazzz我明白了。但是我个人的看法是,如果你使用睡眠线程,你几乎总是做错误的线程。@jsn我再次认为你是对的,这正是我问问题的原因。让我们看看是否有人提供了一个解决方案,它可能不需要使用睡眠(…),同时也不需要连续执行:)感谢您的回复。在我的例子中,调度是动态的,日期必须来自db,然后确定运行作业的最早日期。如果不是这样的话,我可以使用pgagent作业调度器。如SiB所说,拆分操作,将每天调用任务的任务留给cronjob。请参阅上面我对@jsn comment的评论。