【问题标题】:Letting a thread wait vs stopping and starting让线程等待与停止和启动
【发布时间】:2019-04-11 18:17:24
【问题描述】:

我有一个消费者线程在从队列中删除时阻塞。 在某些时间段内,我知道不会将任何内容添加到队列中。

我的问题是:是否值得增加管理何时启动/停止线程的复杂性,还是应该让它等到队列再次开始获取元素?

【问题讨论】:

  • 注意:您不能重新启动已停止的线程;你必须创建一个新的。

标签: java multithreading


【解决方案1】:

如果您使用的并发队列实现是值得的,那么线程将不会在很长时间内为busy-waiting。出于性能原因,某些实现可能会短暂执行此操作,但之后它将阻塞并且不会消耗 CPU 周期。因此,停止线程和阻塞线程之间的区别或多或少变得毫无意义。

使用并发队列。见Which concurrent Queue implementation should I use in Java?

【讨论】:

  • 没有相关但很棒:“如果我的答案之一对您有所帮助,请随时捐赠”,并附上完美链接!并认为有些并不讽刺......
  • 顺便说一句,大多数队列实现都会忙等待很短的时间,例如1000 次尝试后退,让步或等待。这意味着当进程非常活跃时,您会获得接近忙碌等待的性能。上下文切换可能比忙于等待一小段时间更昂贵。
  • @PeterLawrey 谢谢彼得。我确实很快尝试对自己进行事实检查,但找不到任何关于实现细节的体面描述。我已经编辑了我的答案
【解决方案2】:

在处理多线程时,最好的做法是在遇到性能问题时采取行动。否则,我会保持原样以避免麻烦。

【讨论】:

    【解决方案3】:

    我认为线程被阻塞(非活动等待)对性能没有太大影响。如果线程持有可以在那时释放的昂贵资源,这可能是有意义的。我会尽量保持简单,尤其是在并发环境中,复杂性会导致奇怪的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多