Java并发-应该阻塞还是屈服?

Java并发-应该阻塞还是屈服?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有多个线程,每个线程都有自己的私有并发队列,它们所做的只是运行一个无限循环,从中检索消息。其中一个队列可能在一段时间内(可能是几秒钟)没有收到消息,而且它们可能会突然出现,需要快速处理 我想知道在第一种情况下最适合做什么:使用阻塞队列并阻塞线程,直到有更多的输入或执行线程。yield() 我希望在给定的时间内有尽可能多的CPU资源可用,因为并发线程的数量可能会随着时间的推移而增加,但我也不希望消息处理落后,因为无法保证在执行yield()时线程何时会被重新调度以执行。我知道硬件、操作系统和其他

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

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


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


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

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


yield()是一个脾气极其暴躁的野兽——调度程序在它的具体工作中扮演着重要角色;一个简单但有效的实现是什么都不做。

< P>可选地,考虑将实现转换为使用托管实现之一——大概.< /P> 这可能不适合您的用例,但如果是这样的话,它将从您自己的代码中消除担心线程管理的全部负担,而这些关于是否屈服的问题也将消失


此外,如果将来出现更好的线程管理算法(例如,类似于Apple的算法),您可以几乎不费吹灰之力地将应用程序转换为使用它。

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

不,试试图书馆。似乎只有收益才能获得最好的表现!