#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. А, понятно. Я никогда не будил потребителя.