Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Выбор алгоритма выборки объектов из очереди

Привет всем! Есть такой вопросик, ребята. Есть три потока и очередь. Один поток добавляет объекты в очередь, второй и третий, соответственно, забирают. Вопрос в том, как лучше реализовать выборку объектов из очереди. Есть 2 варианта, какой из них предпочтительней с точки зрения многопоточности? Первый: // Класс, который реализует синхронизированную очередь public synchronized void add(Object o) { someQueue.add(o); }
public synchronized Object get() { if(someQueue.size() == 0) return null; else return someQueue.remove(0); }
// Класс, вынимающий объекты. Запущено два инстанса public void run() { while(True) { Object o = queue.get() if (o == null) { TimeUnit.SECONDS.sleep(1); continue; } ...... } Второй: // Класс, который реализует синхронизированную очередь public synchronized void add(Object o) { someQueue.add(o); notifyAll(); }
public synchronized Object get() { if(someQueue.size() == 0) return null; else return someQueue.remove(0); }
// Класс, вынимающий объекты. Запущено два инстанса public void run() { while(True) { Object o = queue.get() if (o == null) { try { synchronized(queue) { queue.wait(1000); } } catch (Exception e) {} continue; } ...... }


Ответ

Так, да. Вы сами ответили. Используйте либо ArrayBlockingQueue либо LinkedBlockingQueue. Conditional Variable тут совсем ни к чему. А ещё можно использовать ExecutorService private final LinkedBlockingQueue myStrangeQueue = new LinkedBlockingQueue();
public void add(String message) { myStrangeQueue.put(message); }
public void run() { try { while (true) processMessage(myStrangeQueue.take()); } catch(InterrupedException ignore) { } }
private void processMessage(String message) { // ... }

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

Отправить комментарий