Нет выходных данных вообще для потоковой передачи производителя / потребителя

#java #multithreading #arraylist #bufferedreader #producer-consumer

#java #многопоточность #arraylist #bufferedreader #производитель-потребитель

Вопрос:

Редактировать: у меня есть класс producer, который отправляет некоторые данные в класс SharedBuffer. Эти данные добавляются в ArrayList с установленным пределом 100. Нет проблем с добавлением данных в указанный список, но классу consumer не удается получить какие-либо данные из списка.

Вывод вообще не создается (нет 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.
            }
        }
    }   
  

Комментарии:

1. Можете ли вы более конкретно рассказать о своей проблеме и опубликовать только соответствующий код.

2. Я отредактировал сообщение. Я надеюсь, что теперь ему лучше.

3. Как вы помещаете данные в буфер.

4. Ваш isEmpty метод тоже должен быть синхронизирован, потому что он обращается data к полю.

5. Я добавил метод put, но сомневаюсь, что это проблема.

Ответ №1:

Измените свой код (добавьте 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;
}
  

Также вы должны isEmpty синхронизировать isFull методы and, потому что доступ к data .

Комментарии:

1. А, понятно. Я никогда не будил потребителя.