首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在java多线程中维护生产者任务的顺序

无法在java多线程中维护生产者任务的顺序
EN

Stack Overflow用户
提问于 2013-09-12 14:13:49
回答 6查看 541关注 0票数 3

我正在编写一个多线程应用程序,其中有n个生产者,他们试图向共享资源添加一个元素。我希望保持生产者在共享资源中生成元素的顺序。

例如,我的共享资源是一个SynchronizedQueue,P1、P2、P3、p4将以P1、p2、p3、P4的顺序生成一个新元素,在此期间,P5 producer将其元素添加到队列中,因此p1、P2、P3、P4将等待锁。一旦P5释放锁,P1-4中的任何一个都将获得锁,因此我们将释放元素的顺序。

有没有办法维持等待锁的元素的顺序?据我所知,这是不可能的,但我想检查一下这是否可以通过编程来实现。

EN

回答 6

Stack Overflow用户

发布于 2013-09-12 14:35:52

我能想到的一种方法是创建一个包装类PriorityP,它具有字段int priorityP value

然后为每个线程分配一个优先级(int),线程会给出一个具有适当优先级和值的PriorityP作为结果。

现在,您可以使用PriorityBlockingQueue代替SynchronizedQueue,并在PriorityP类中实现Comparator接口。

当你这样做的时候,每当一个线程将他的值输入到队列中时,它就会自动放在正确的位置。

票数 1
EN

Stack Overflow用户

发布于 2013-09-12 14:27:53

您没有提供任何代码来查看如何在共享资源上获取/释放锁,但是您可能对java.util.concurrent.locks.ReentrantLock类感兴趣。

这个类的构造函数

接受一个可选的公平性参数。当设置为true时,在争用情况下,锁倾向于向等待时间最长的线程授予访问权限。

因此,如果P1、P2、P3尝试按该顺序获取可重入锁,而共享资源被锁定,则等待时间最长的线程(在本例中为P1)将首先获得锁,然后是P2,然后是P3,然后是之后的任何其他线程。

票数 0
EN

Stack Overflow用户

发布于 2013-09-12 14:34:45

如果您有一种方法可以为存储在队列中的元素赋值,那么您就可以使用PriorityBlockingQueue而不是SynchronizedQueue。优先级队列的元素根据它们的自然排序来排序,或者由在队列构造时提供的比较器排序。

例如,您可以将生产者的id存储在元素中,并拥有一个知道如何在生产者id之间进行比较的Comparator

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18756650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档