java - 无法在 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();
}
}
解决方案
推荐阅读
- python - 打印异常的输出是什么,为什么它与输出的字符串不匹配
- javascript - 无法映射 API 数据以响应本机 Picker
- java - 有没有办法在 Java 中为数组定义添加条件?
- laravel - 有没有办法使用 JWT 和 Laravel 修复传递给 Tymon\\JWTAuth\\JWTGuard::__construct() 的参数 2?
- tableau-api - Tableau 维度分组和使用两个日期字段?
- r - 您如何在 Rstudio 上从同一网站上抓取多个页面
- python - Python Camelot - 如何从表中删除线喙/n
- angular - 在指令中使用哪个@HostListener 来监听表单控件重置/设置值?
- sql - 如何在特定时间间隔内填充缺失值
- python - 将临时文件传递给 Popen 子进程?