编辑:
我有一个生产者类,可以将一些数据发送到SharedBuffer类。将此数据添加到ArrayList并将其限制设置为100。将数据添加到所述列表没有问题,但是使用者类无法设法从列表中获取任何数据。

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

编辑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方法,因为可以访问data

07-25 22:22
查看更多