哪种方法更好?允许线程暂停一段时间或删除它并在以后重新创建它?

时间:2008-12-04 15:48:02

标签: multithreading sleep

我们有一个需要每两个小时运行一次的流程。这是一个需要在自己的线程上运行的进程,以免中断正常处理。

运行时,它将下载100k记录并针对数据库进行验证。运行它的框架有很多对象来管理这个过程。这些对象只需要在进程运行时出现。

什么是更好的标准?

  1. 让线程处于等待模式,直到我再次需要它为止。或者,

  2. 完成后删除它并在下次需要时创建它? (系统计时器事件。)

13 个答案:

答案 0 :(得分:9)

两种解决方案之间没有太大区别。我倾向于选择每次创建线程的那个。

线程围绕消耗资源(至少内存)。在垃圾收集语言中,可能很容易在此线程中保留一些对象,从而使用更多内存。如果您没有铺设线程,则释放所有资源并使其可用于主进程两小时。

当你想要停止你的线程可能正在执行的整个过程时,你需要干净地中断线程。中断线程或知道它是在休眠还是工作总是很困难。你可能会遇到一些竞争条件。按需启动线程可以使您免受这些潜在问题的影响:您知道是否启动了线程,在这种情况下调用thread_join会让您等到线程完成。

出于这些原因,我会选择线程随需应变解决方案,即使另一个没有无法解决的问题。

答案 1 :(得分:4)

每两个小时开始一个线程非常便宜,所以我会坚持下去。

但是,如果将来某个时候处理可能需要的时间超过运行间隔,那么您可能希望保持线程处于活动状态。这样,您将不会创建第二个线程,该线程将在第一个仍在运行时开始处理记录,可能会破坏数据或处理记录两次。

答案 2 :(得分:3)

要么两者都应该没问题,但我会倾向于保留线程,以便验证时间超过预期(例如:慢速网络链接或数据库响应缓慢)。

答案 3 :(得分:3)

两小时后你怎么记得开始一个新线程?有计时器? (那是另一个线程!)另一个线程一直睡到指定的时间?关闭线程并根据其他地方运行的东西重新启动它,如果其他东西在其自己的单独线程上,或者当它等待“创建”工作线程时两小时结束时阻止主应用程序就没有用了,不是吗?

让线程睡觉......

答案 4 :(得分:1)

我同意Vilx的观点,这主要是品味问题。这两种方法都有处理和内存开销,但可能还不够重要。

答案 5 :(得分:1)

如果您使用的是 Java ,则可以查看计时器类。它允许您在给定时间内安排任务。

另外,如果您需要更多控制,可以使用石英库。

答案 6 :(得分:1)

我想实际上让线程进入睡眠状态是最有效的,结束它并重新创建它会“花费”一些资源,而让它进入睡眠状态只会填充一个空间,而数据可以通过操作来分页。系统,如果需要。

但无论如何,这可能不是一个很大的区别,差异可能取决于操作系统的优势等等......

答案 7 :(得分:1)

这真的取决于我可以说的一件事......状态。

如果线程在线程运行的下一次迭代中创建了很多有用的状态(分配内存),那么我会保留它。这样,如果自上次运行以来某些事情发生了变化,您的流程可以通过仅执行某些操作来潜在地优化其运行。

但是,如果进程创建的状态与要完成的工作量相比是显着的,并且您在计算机上的资源不足,则可能不值得在exectutions之间保持状态的成本。如果是这种情况,那么每次都应该从头开始重新创建线程。

答案 8 :(得分:0)

我认为这只是一个品味问题。两者都很好。使用您觉得更容易实现的那个。 :)

答案 9 :(得分:0)

我会一次创建线程,并使用事件/条件变量让它睡眠,直到发出信号再次唤醒。这样,如果需要更改所需的时间,您只需要更改触发事件的时间,您的代码仍然非常干净。

答案 10 :(得分:0)

我不认为这非常重要,但最佳方法非常依赖于平台。

.NET System.Threading.Timer在等待时不需要任何费用,并将在池线程上调用您的代码。从理论上讲,这将是你的两个建议中最好的。

答案 11 :(得分:0)

如果您使用像Java这样的垃圾收集系统,另一个需要考虑的重要事项是睡眠线程强烈引用的任何内容都不是垃圾。在这方面,最好杀死空闲线程,让它们以及它们引用的任何对象得到清理。

答案 12 :(得分:0)

当然,这一切都取决于。但是默认情况下,我会根据需要启动一个单独的进程(而不是线程)。