代码之家  ›  专栏  ›  技术社区  ›  Jeremiah

哪种方法更好?允许线程休眠一段时间,还是删除它并稍后重新创建?

  •  6
  • Jeremiah  · 技术社区  · 17 年前

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

    当它运行时,它将下载10万条记录,并根据数据库进行验证。运行此过程的框架有很多管理此过程的对象。这些对象只需要在进程运行时存在。

    什么是更好的标准?

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

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

    13 回复  |  直到 11 年前
        1
  •  9
  •   Pierre    17 年前

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

    周围有一根线 消耗资源 (至少是记忆)。在垃圾回收语言中,可能很容易在这个线程中保留一些对象,从而使用更多的内存。如果你没有线程,所有资源都会被释放,并可供主进程使用两个小时。

    当你想停止整个进程时,你的线程可能正在执行也可能没有执行,你需要 彻底中断线程 .总是很难中断一个线程或知道它是在睡觉还是在工作。你可能在那里有一些比赛条件。按需启动线程可以让你摆脱这些潜在的问题:你知道你是否启动了线程,在这种情况下调用 thread_join 让你等到线程完成。

    由于这些原因, 我会选择按需线程解决方案 ,尽管另一个没有难以解决的问题。

        2
  •  4
  •   Rob Prouse    17 年前

    每两个小时启动一个线程非常便宜,所以我会这样做。

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

        3
  •  3
  •   rich    17 年前

    两者都可以,但我倾向于在验证时间比预期长的情况下(例如:网络链接缓慢或数据库响应缓慢)保留线程。

        4
  •  3
  •   Charles Bretana    17 年前

    当两个小时结束时,你会怎么记住开始一个新的线程?有计时器吗?(这是在另一个线程上!)另一个在指定时间之前休眠的线程?如果其他线程位于它自己的独立线程上,或者在两个小时后等待“创建”工作线程时阻塞主应用程序,那么关闭线程并根据其他地方运行的东西重新启动它对你没有好处,不是吗?

    让线程睡觉。..

        5
  •  1
  •   Paul Tomblin    17 年前

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

        6
  •  1
  •   Marko    17 年前

    如果您正在使用 Java 你可以查一下 定时器 类。它允许您在给定时间安排任务。

    此外,如果你需要更多的控制,你可以使用石英库。

        7
  •  1
  •   Stein G. Strindhaug    17 年前

    我想实际上让线程进入睡眠状态是最有效的,结束它并重新创建它会“消耗”一些资源,而让它进入睡眠状态只会在日程表中填充一点空间,而它的数据可以在需要时被操作系统分页。

    但无论如何,这可能不是很大的区别,区别可能取决于操作系统的时间表有多好,等等。。。

        8
  •  1
  •   Nick    17 年前

    据我所知,这真的取决于一件事。..国家。

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

    但是,如果该过程创建的状态与要完成的工作量相比是重要的,并且机器上的资源短缺,那么在执行之间保持状态的成本可能不值得。如果是这样的话,那么每次都应该从头开始重新创建线程。

        9
  •  0
  •   Vilx-    17 年前

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

        10
  •  0
  •   Nicholas Mancuso    17 年前

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

        11
  •  0
  •   Will Dean    17 年前

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

    A.NET系统。穿线。计时器在等待时不花费任何费用,并将在池线程上调用您的代码。理论上,这将是你两个建议中最好的一个。

        12
  •  0
  •   erickson    17 年前

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

        13
  •  0
  •   sudarkoff    17 年前

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

    推荐文章