有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

例如,我的共享资源是一个SynchronizedQueue,P1、P2、P3、P4将按照P1、P2、P3、P4的顺序生成新元素,在这段时间内,P5 producer将其元素添加到队列中,因此P1、P2、P3、P4将等待锁。一旦P5释放了锁,P1-4中的任何一个都会获得锁,所以我们放松了元素的顺序

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


共 (3) 个答案

  1. # 1 楼答案

    这是一个错误的目标。我猜你的制作人是线程。线程的执行顺序没有严格定义——一次线程A可以比线程B运行得更快,另一次线程B运行得更快,因此您想要保留的顺序本身是随机的,不值得关注。此外,将一个元素添加到队列中所花费的时间是如此之小,以至于即使是两个或多个线程同时进行,也可以认为它是在同一时刻发生的。p>

    多线程类似于相对论物理——没有宇宙时间,只发生在关系之前。如果所产生的事件之间存在这种关系,那么应该使用这种关系。元素添加到公共队列的时间不能作为这种关系

  2. # 2 楼答案

    问题在于,获取锁的顺序可以任意不同于生成元素的顺序,甚至可以任意不同于多线程环境中生产者排队获取锁的顺序。所以你最终会遇到和你想解决的问题一样的问题。(见recursion

    并非所有问题都可以通过另一种间接方式解决;-)

  3. # 3 楼答案

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

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