首页 > 解决方案 > 无法在 Java 中的线程之间获取更新的列表

问题描述

我正在做一些关于 Java 多线程的课程。我已经尝试(跟随讲师)将两个从 ArrayList 读取的消费者与一个用一些基本输入填充它的生产者同步。然而生产者给出了第一个数字,而消费者进入了无限循环,因为它得到了空列表。不知道如何强制它获得正确的值。

制片人:

    class MyProducer implements Runnable {
      private List<String> buffer;
      private String color;

    public MyProducer(List<String> buffer, String color) {
        this.buffer = buffer;
        this.color = color;
    }

    public void run() {
        Random random = new Random();
        String[] nums = {"1", "2", "3", "4", "5"};

        for(String num: nums) {
            try {
                System.out.println(color + "Adding..." + num);
                synchronized (buffer) {
                    buffer.add(num);
                    System.out.println(buffer);
                }

                Thread.sleep(random.nextInt(1000));
            } catch (InterruptedException e) {
                System.out.println("Producer was interrupted");
            }
        }
        System.out.println(color + "Adding EOF and exiting...");
        synchronized (buffer) {
            buffer.add(EOF);
        }
    }
}

消费者:

    class MyConsumer implements Runnable {
      private List<String> buffer;
      private String color;

    public MyConsumer(List<String> buffer, String color) {
        this.buffer = buffer;
        this.color = color;
    }

    public void run() {
        synchronized (buffer) {
            while(true) {
                if (buffer.isEmpty()) {
                    continue;
                }
                System.out.println("Przejście między warunkami działa");
                if (buffer.get(0).equals(EOF)) {
                    System.out.println(color + "Exiting");
                    break;
                } else {
                    System.out.println(color + "Removed" + buffer.remove(0));
                }
            }
        }
    }
 }

主要的:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import static com.siecz-k-.Main.EOF;

public class Main {
    public static final String EOF = "EOF";

    public static void main(String[] args) {

        List<String> buffer = new ArrayList<>();
        MyProducer producer = new MyProducer(buffer, ThreadColor.ANSI_CYAN);
        MyConsumer consumer1 = new MyConsumer(buffer, ThreadColor.ANSI_PURPLE);
        MyConsumer consumer2 = new MyConsumer(buffer, ThreadColor.ANSI_RED);

        new Thread(producer).start();
        new Thread(consumer1).start();
        new Thread(consumer2).start();

    }
}

标签: javamultithreading

解决方案


推荐阅读