【问题标题】:Java concurrency - Should block or yield?Java 并发 - 应该阻塞还是屈服?
【发布时间】:2010-03-09 20:36:43
【问题描述】:

我有多个线程,每个线程都有自己的私有并发队列,它们所做的只是运行一个无限循环从中检索消息。其中一个队列可能会在一段时间内(可能是几秒钟)没有接收到消息,并且它们可能会大量出现,因此需要快速处理。

我想知道在第一种情况下最适合做什么:使用阻塞队列并阻塞线程,直到我有更多输入或执行 Thread.yield()?

我希望在给定时间拥有尽可能多的可用 CPU 资源,因为并发线程的数量可能会随着时间的推移而增加,但我也不希望消息处理落后,因为无法保证当执行 yield() 时线程将被重新调度执行。我知道硬件、操作系统和其他因素在这里起着重要作用,但抛开这些,从 Java(JVM?)的角度来看,什么是最优化的?

【问题讨论】:

    标签: java multithreading concurrency


    【解决方案1】:

    总是在队列中阻塞。 Java 在内部队列中产生。

    换句话说:如果您在其中一个线程中让步而不只是阻塞,则无法在其他线程中获得任何性能优势。

    【讨论】:

    • 不,试试disruptor 库。似乎只有产量才能获得最佳性能!
    【解决方案2】:

    您当然希望使用阻塞队列——它们正是为此目的而设计的(您希望您的线程在没有工作可做时不使用 CPU 时间)。

    Thread.yield() 是一个非常喜怒无常的野兽——调度程序在它所做的事情中扮演着重要的角色;一种简单但有效的实现方式就是什么都不做。

    【讨论】:

      【解决方案3】:

      或者,考虑将您的实现转换为使用托管ExecutorService 实现之一 - 可能是ThreadPoolExecutor

      这可能不适合您的用例,但如果适合,它可以消除您自己的代码中担心线程管理的全部负担 - 并且这些关于屈服或不简单消失的问题。

      此外,如果将来出现更好的线程管理算法(例如,类似于 Apple 的 Grand Central Dispatch),您或许可以毫不费力地将您的应用程序转换为使用它。

      【讨论】:

        【解决方案4】:

        您可以做的另一件事是为您的队列使用并发哈希映射。当您进行读取时,它会为您提供您正在寻找的对象的参考,因此您可能会错过刚刚放入队列的消息。但是,如果这一切都是在侦听消息,那么您将在下一次迭代中捕获它。如果消息可以由其他线程更新,那将是不同的。但似乎没有理由阻止我可以看到。

        【讨论】:

          猜你喜欢
          • 2012-11-13
          • 2014-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-11
          • 1970-01-01
          • 1970-01-01
          • 2018-11-15
          相关资源
          最近更新 更多