Java: синхронизированный буфер - PullRequest
2 голосов
/ 20 октября 2011

У меня есть один поток, который получает пакеты tcp, и добавляю каждую строку в буфер, который является ArrayList<String>. Другой поток должен периодически проверять, доступны ли новые данные, но только если буфер в настоящий момент не заблокирован. Но как я могу проверить, был ли он заблокирован? В C ++ я мог явно заблокировать мьютекс.

Вот какой-то псевдокод того, что я хотел бы сделать:

 while(buffer.isLocked()) 
 { 
    buffer.wait();
 }

 buffer.lock();
 buffer.add(tcpPacket);
 buffer.unlock();
 buffer.notify();

Это мой код Java:

void process(String tcpPacket)
{

     synchronized(buffer)
     {
         buffer.add(tcpPacket);
     }
     buffer.notify();
}

Ответы [ 2 ]

9 голосов
/ 20 октября 2011

Это стандартная проблема производителя-потребителя. JDK предоставляет ArrayBlockingQueue для беспрепятственной обработки этого.

0 голосов
/ 20 октября 2011

Хотя в этом случае вы могли бы рассмотреть возможность использования трубы. (PipedInputStream и PipedOutputStream), а затем используйте блокирующие методы ввода-вывода, чтобы гарантировать, что потоки правильно просыпаются по мере поступления пакетов ... Это кажется гораздо более простым подходом к проблеме «общего буфера».

...