В моей программе есть поток «Отправитель» и «Получатель», оба из которых действуют в одной очереди.Синхронизация очередей
Я определил свою очередь в классе, как:
static Queue<my_class> queue = new LinkedList<my_class>();
Однако, я думаю, что я сталкиваюсь с проблемами, потому что мой Queues
не синхронизирован. В моем потоке «Receiver» мне иногда приходится удалять элементы из очереди, которые влияют на работу потока «Sender».
Я читал про BlockingQueues
и задавался вопросом, не нужно ли мне это использовать в моей ситуации? Если да, как мне изменить свое объявление? Должен ли я также объявлять BlockingQueue
в потоках «Отправитель» и «Получатель»?
Будет ли BlockingQueue
гарантировать, что только один поток обратился к очереди в любой момент времени?
К сожалению, я совершенно новый для концепции синхронизации и я нахожу это довольно запутанным ..
Спасибо за вашу помощь.
Пожалуйста, ознакомьтесь с [Реализация очереди] (http://docs.oracle.com/javase/tutorial/collections/implementations/queue.html). – mre
'BlockingQueue' - это интерфейс; если вам не нужны какие-либо другие методы, кроме того, что уже предоставляет «Queue» (обратите внимание, что 'BlockingQueue' расширяет' Queue'), вы можете просто инициализировать свою «очередь» потоковой безопасностью, например 'LinkedBlockingQueue'. – fge
«В моем потоке« Получатель »мне иногда приходится удалять элементы из очереди, которые влияют на работу потока« Отправитель ». <- Вы можете уточнить? – fge