Привет всем!
Есть такой вопросик, ребята. Есть три потока и очередь. Один поток добавляет объекты в очередь, второй и третий, соответственно, забирают.
Вопрос в том, как лучше реализовать выборку объектов из очереди. Есть 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
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) {
// ...
}
Комментариев нет:
Отправить комментарий