gpt4 book ai didi

java - 在多线程程序中没有得到预期的结果

转载 作者:行者123 更新时间:2023-12-02 10:24:40 25 4
gpt4 key购买 nike

我没有得到下面程序的预期结果,我期望生产者和消费者方法都应该按某种顺序执行,但由于某种原因只有生产者方法被执行。

我有两个问题:

  1. 我无法理解这种行为。
  2. 在主方法的最后一行将两个线程连接在一起工作正常,我无法理解两者之间的区别。

    public class ProducerConsumer {
    List<Integer> data = new ArrayList<>();

    synchronized void produce() throws InterruptedException {
    for (int i = 0; i < 10; i++) {
    System.out.println("Producing");
    data.add(i);
    }
    wait();
    }

    synchronized void consume() throws InterruptedException {
    System.out.println("Consuming");
    data.clear();
    notify();
    }

    public static void main(String[] args) throws InterruptedException {
    ProducerConsumer pc = new ProducerConsumer();

    Runnable r2 = ()-> {
    try {
    pc.produce();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    };
    Thread thread1 = new Thread(r2);
    thread1.start();
    thread1.join();




    Runnable r1 = () -> {
    try {
    pc.consume();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    };
    Thread thread = new Thread(r1);
    thread.start();
    thread.join();

    }

    输出:生产生产生产生产生产生产生产生产生产制作

最佳答案

product() 方法以 wait() 结束。因此它会阻塞,直到某个线程通知它为止。

执行此操作的唯一线程是消费者线程。但是消费者线程只有在生产者线程结束后才由 main 方法启动。而且在收到通知之前它无法结束。所以你陷入了僵局。

如果仅在两个线程启动后join(),那么消费者线程就可以启动,而不必等待生产者线程完成。这仍然不能使程序正确,因为

  • 您无法保证生产者线程将首先执行
  • 最后调用 wait() 是没有用的
  • 在循环外调用 wait() 检查条件不正确
  • 如果你想让方法按顺序执行,使用线程是没有用的。您可以从主线程执行所有操作。

关于java - 在多线程程序中没有得到预期的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54064310/

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