gpt4 book ai didi

java - 生产者/消费者线程根本没有输出数据

转载 作者:行者123 更新时间:2023-12-01 09:25:41 25 4
gpt4 key购买 nike

编辑:我有一个生产者类,它将一些数据发送到 SharedBuffer 类。该数据被添加到 ArrayList 中,限制设置为 100。将数据添加到所述列表中没有问题,但消费者类无法从列表中获取任何数据。

根本不产生任何输出(没有空值或错误)。

编辑2:添加了将数据放入数组的方法。

SharedBuffer 类:

    static final int RESOURCE_LIMIT = 100;

private List<String> data = new ArrayList<String>();
// private boolean done = false;


public boolean isFull(){
return data.size() >= RESOURCE_LIMIT;
}

public boolean isEmpty(){
return data.size() <= 0;
}

public synchronized void putData(String s){
while(this.isFull()){
try{
wait();
}catch(InterruptedException e){
//
e.printStackTrace();
}
}
data.add(s);
//size works and there is data in list.
//System.out.println(data.size() + data.get(0));

public boolean isEmpty(){
return data.size() <= 0;
}

public synchronized String getData(){
while(this.isEmpty()){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}

String s_data = (String)(data.get(0));
if(s_data != null){
data.remove(s_data);
System.out.println(s_data);
}
return s_data;
}

消费者阶层:

    @Override
public void run() {
while(true){
String line = buffer.getData();
if(line != null){
System.out.println(line);

//do stuff with the data.
}
}
}

最佳答案

更改您的代码(添加 notyfyAll() 调用)

public synchronized void putData(String s){
while(this.isFull()){
try{
wait();
}catch(InterruptedException e){
//
e.printStackTrace();
}
}
data.add(s);
notifyAll();
}

public synchronized String getData(){
while(this.isEmpty()){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}

String s_data = (String)(data.get(0));
if(s_data != null){
data.remove(s_data);
System.out.println(s_data);
}
notifyAll();
return s_data;
}

此外,您还应该同步 isEmptyisFull 方法,因为要访问数据

关于java - 生产者/消费者线程根本没有输出数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39856050/

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