gpt4 book ai didi

java - 多生产者和消费者多线程 Java 未按预期工作

转载 作者:行者123 更新时间:2023-12-02 09:29:54 24 4
gpt4 key购买 nike

我正在研究 Java 的生产者-消费者问题的多个生产者和消费者用例。代码位于 github 。相同的实现适用于 single producer consumer用例,但对于多个生产者消费者的情况表现得很奇怪。

我对输出有一些疑问:

一开始,所有生产者和一个消费者都拥有锁:

Producer t1 has lock
t5 produced 1, integerQueue: [1]
Producer t5 notifiedAll
  1. 我认为所有线程都应该竞争锁,并且最多应该有一个线程一直拥有锁?所有生产者都共享锁吗?当生产者线程 t1 持有锁时,消费者线程 t5 是如何获得锁的?

运行一段时间后,又出现了一个奇怪的现象:

Producer t5 has lock
t5 produced 10, integerQueue: [8, 9, 10]
Producer t5 notifiedAll

Producer t5 has lock
t5 produced 11, integerQueue: [8, 9, 10, 11]
Producer t5 notifiedAll

Consumer t8 has lock
t8 consumed 8, integerQueue: [9, 10, 11]
Consumer t8 notified All

Consumer t8 has lock
t8 consumed 9, integerQueue: [10, 11]
Consumer t8 notified All
  • 似乎除了一个生产者和消费者之外的所有线程都已死亡,并且这两个线程正在彼此之间切换锁定。为什么会发生这种情况?所有其他生产者和消费者发生了什么?
  • 非常感谢任何帮助。

    最佳答案

    您正在使用 Producer5 可运行对象的单个实例,并将其多次提交给执行服务。

        Producer5 producer = new Producer5(queue, maxCapacity);
    pool.execute(producer);
    pool.execute(producer);
    pool.execute(producer);
    pool.execute(producer);
    pool.execute(producer);

    因此,该单个 Producer5 实例中的 threadName 字段将被覆盖多次并且没有用(它将不再打印出实际线程的名称)运行,此外,它需要是 volatile ,以便由多个线程正确更新——对于正确的某些定义)。

      System.out.println(String.format("\nProducer %s has lock",
    threadName // this will be the name of the last thread that entered `run`,
    // they all share the same instance
    ));

    如果包含可变状态,请勿重复使用相同的 Runnable 实例。为每个执行线程创建一个单独的实例。

    <小时/>

    How did consumer thread t5 get the lock while producer thread t1 was holding it?

    仍然是线程 t1 运行此代码,但 threadName 字段同时已由线程 t5 更新。高度误导性的输出。

    It seems all threads except one producer and consumer had died and those 2 are switching lock between each other.

    线程仍然处于 Activity 状态,但只有两个 threadName 字段存在,线程轮流更新它们(位于 run 的顶部)方法),最终确定某个值。所有线程现在只打印该值。

    关于java - 多生产者和消费者多线程 Java 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58078629/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com