2013-06-04 2 views
0

В моей программе есть поток «Отправитель» и «Получатель», оба из которых действуют в одной очереди.Синхронизация очередей

Я определил свою очередь в классе, как:

static Queue<my_class> queue = new LinkedList<my_class>(); 

Однако, я думаю, что я сталкиваюсь с проблемами, потому что мой Queues не синхронизирован. В моем потоке «Receiver» мне иногда приходится удалять элементы из очереди, которые влияют на работу потока «Sender».

Я читал про BlockingQueues и задавался вопросом, не нужно ли мне это использовать в моей ситуации? Если да, как мне изменить свое объявление? Должен ли я также объявлять BlockingQueue в потоках «Отправитель» и «Получатель»?

Будет ли BlockingQueue гарантировать, что только один поток обратился к очереди в любой момент времени?

К сожалению, я совершенно новый для концепции синхронизации и я нахожу это довольно запутанным ..

Спасибо за вашу помощь.

+0

Пожалуйста, ознакомьтесь с [Реализация очереди] (http://docs.oracle.com/javase/tutorial/collections/implementations/queue.html). – mre

+0

'BlockingQueue' - это интерфейс; если вам не нужны какие-либо другие методы, кроме того, что уже предоставляет «Queue» (обратите внимание, что 'BlockingQueue' расширяет' Queue'), вы можете просто инициализировать свою «очередь» потоковой безопасностью, например 'LinkedBlockingQueue'. – fge

+0

«В моем потоке« Получатель »мне иногда приходится удалять элементы из очереди, которые влияют на работу потока« Отправитель ». <- Вы можете уточнить? – fge

ответ

0

Вам необходимо будет объявить BlockingQueue в приемнике, чтобы он мог использовать метод take; отправитель все еще может использовать объявление Queue с его методом offer, но вам нужно объявить BlockingQueue, если вы хотите использовать метод offer(E e, long timeout, TimeUnit unit).

Большинство реализаций BlockingQueue фактически блокируются, что означает, что один поток может быть добавлен к нему, в то время как из него берется еще один поток нитей (блокировка без ограничений обычно более масштабируема, чем реализации, которые используют блокировки). Независимо от реализации, BlockingQueue является потокобезопасным.

0

Главное преимущество заключается в том, что BlockingQueue обеспечивает правильную, потокобезопасную реализацию. Эта реализация была разработана, рассмотрена и поддерживается экспертами по параллелизму.

Блокирующая очередь - это очередь, которая блокируется при попытке удалить из нее очередь, а очередь пуста или если вы пытаетесь вставить в нее элементы, а очередь уже заполнена. Поток, пытающийся удалить из пустой очереди, блокируется до тех пор, пока какой-либо другой поток не вставит элемент в очередь. Нить, пытающаяся присвоить элемент в полной очереди, блокируется до тех пор, пока какой-либо другой поток не освободит место в очереди, либо путем удаления одного или нескольких элементов, либо очистки всей очереди.

Смежные вопросы