我正在编写一个多线程应用程序,其中有n个生产者,他们试图向共享资源添加一个元素。我希望保持生产者在共享资源中生成元素的顺序。
例如,我的共享资源是一个SynchronizedQueue,P1、P2、P3、p4将以P1、p2、p3、P4的顺序生成一个新元素,在此期间,P5 producer将其元素添加到队列中,因此p1、P2、P3、P4将等待锁。一旦P5释放锁,P1-4中的任何一个都将获得锁,因此我们将释放元素的顺序。
有没有办法维持等待锁的元素的顺序?据我所知,这是不可能的,但我想检查一下这是否可以通过编程来实现。
发布于 2013-09-12 14:35:52
我能想到的一种方法是创建一个包装类PriorityP
,它具有字段int priority
和P value
。
然后为每个线程分配一个优先级(int
),线程会给出一个具有适当优先级和值的PriorityP
作为结果。
现在,您可以使用PriorityBlockingQueue
代替SynchronizedQueue
,并在PriorityP
类中实现Comparator
接口。
当你这样做的时候,每当一个线程将他的值输入到队列中时,它就会自动放在正确的位置。
发布于 2013-09-12 14:27:53
您没有提供任何代码来查看如何在共享资源上获取/释放锁,但是您可能对java.util.concurrent.locks.ReentrantLock类感兴趣。
这个类的构造函数
接受一个可选的公平性参数。当设置为true时,在争用情况下,锁倾向于向等待时间最长的线程授予访问权限。
因此,如果P1、P2、P3尝试按该顺序获取可重入锁,而共享资源被锁定,则等待时间最长的线程(在本例中为P1)将首先获得锁,然后是P2,然后是P3,然后是之后的任何其他线程。
发布于 2013-09-12 14:34:45
如果您有一种方法可以为存储在队列中的元素赋值,那么您就可以使用PriorityBlockingQueue而不是SynchronizedQueue
。优先级队列的元素根据它们的自然排序来排序,或者由在队列构造时提供的比较器排序。
例如,您可以将生产者的id存储在元素中,并拥有一个知道如何在生产者id之间进行比较的Comparator。
https://stackoverflow.com/questions/18756650
复制相似问题