Java 使用LinkedBlockingQueue时,我如何优先考虑消费者?

Java 使用LinkedBlockingQueue时,我如何优先考虑消费者?,java,concurrency,Java,Concurrency,我使用LinkedBlockingQueue和生产者/消费者模式来缓冲任务。要将任务添加到队列中,我使用生产者的方法:queue.putObject;要从我为消费者使用的队列中获取任务,请执行以下操作:queue.takeObject 我在JavaAPI中发现,这两种方法都将阻塞,直到队列可用为止。我的问题是:我知道一个事实,我的系统中任务的生产者比消费者多。我所有的任务都需要处理。因此,我需要我的消费者在被阻止时优先于生产者来获得队列 他们是否可以在不改变LinkedBlockingQueue

我使用LinkedBlockingQueue和生产者/消费者模式来缓冲任务。要将任务添加到队列中,我使用生产者的方法:queue.putObject;要从我为消费者使用的队列中获取任务,请执行以下操作:queue.takeObject

我在JavaAPI中发现,这两种方法都将阻塞,直到队列可用为止。我的问题是:我知道一个事实,我的系统中任务的生产者比消费者多。我所有的任务都需要处理。因此,我需要我的消费者在被阻止时优先于生产者来获得队列


他们是否可以在不改变LinkedBlockingQueue方法的情况下实现这一点?

没有必要将消费者优先于生产者,因为他们在完全不同的条件下进行阻止:如果生产者因为队列已满而被阻止,那么消费者不会因为队列为空而被阻止


例如,由于队列已满,producer1有一个阻塞的put调用。然后Consumer1执行take,这将正常进行,因为队列不是空的,除非您的队列容量为0,这将是愚蠢的-消费者不知道或关心生产者的put调用被阻止,它关心的只是队列不是空的。

没有必要将消费者优先于生产者,因为它们在完全不同的条件下阻塞:如果生产者因为队列已满而被阻塞,那么消费者不会因为队列为空而被阻塞

例如,由于队列已满,producer1有一个阻塞的put调用。然后,Consumer1执行take,这将正常进行,因为队列不是空的,除非您的队列的容量为0,这将是愚蠢的-消费者不知道或关心生产者的put调用被阻止,它关心的只是队列不是空的

由于有多个独立的锁,被阻止的生产者不会阻止消费者

以各国为例:

检索并删除此队列的头,如有必要,等待元素可用

请缔约国:

在该队列的尾部插入指定的元素,如有必要,等待空间变为可用

如果没有空间,那么put将被阻塞,但是take不会被阻塞,因为只有当队列为空时,它才是通过设计等待实现的,这里的情况显然不是这样

原始评论:


据我所知,这个队列在设计上不会阻止消费者,即使生产者因为队列已满而被阻止

由于有多个独立的锁,被阻止的生产者不会阻止消费者

以各国为例:

检索并删除此队列的头,如有必要,等待元素可用

请缔约国:

在该队列的尾部插入指定的元素,如有必要,等待空间变为可用

如果没有空间,那么put将被阻塞,但是take不会被阻塞,因为只有当队列为空时,它才是通过设计等待实现的,这里的情况显然不是这样

原始评论:


据我所知,这个队列在设计上不会阻止消费者,即使生产者因为队列已满而被阻止


LinkedBlockingQueue使用两个重入锁

private final ReentrantLock putLock=新的ReentrantLock

private final ReentrantLock takeLock=新的ReentrantLock

由于两个船闸是分开的,为执行其操作,将隔水闸分开放置,因此一个操作不会影响其他操作


干杯

LinkedBlockingQueue使用两个重入锁

private final ReentrantLock putLock=新的ReentrantLock

private final ReentrantLock takeLock=新的ReentrantLock

由于两个船闸是分开的,为执行其操作,将隔水闸分开放置,因此一个操作不会影响其他操作


干杯

据我所知,这个队列在设计上不会阻止消费者,即使生产者因队列已满而被阻止。据我所知,这个队列在设计上不会阻止消费者,即使生产者因队列已满而被阻止。因此,生产者和消费者可以同时访问队列?!谢谢你的快速回答!对但是,还有一些其他操作会完全锁定队列的读写操作。e、 g.如果调用toArray或clear方法,那么生产者和消费者可以同时访问队列?!谢谢你的快速回答!对但是,还有一些其他操作会完全锁定队列的读写操作。e、 如果调用toArray或clear方法。