Пример корректного использования методов wait и notify класса Object для многопоточных задач.
Пусть есть поток А, которому необходимо остановиться и ожидать получения значения от потока В.
Решение. Хорошее решение использовать библиотеку java.util.concurrent.*. В частности, передача данных между потоками должна происходить через очередь, а синхронизация их выполнения великолепно выполняется через CountDownLatch.
Однако при необходимости, можно справиться и встроенными средствами.
Выглядит это примерно так.
см. так же
Годная статья
Пусть есть поток А, которому необходимо остановиться и ожидать получения значения от потока В.
Решение. Хорошее решение использовать библиотеку java.util.concurrent.*. В частности, передача данных между потоками должна происходить через очередь, а синхронизация их выполнения великолепно выполняется через CountDownLatch.
Однако при необходимости, можно справиться и встроенными средствами.
Выглядит это примерно так.
public class Settable {
private static final Object NOT_SET = new Object();
private final AtomicReference slot = new AtomicReference<>((V)NOT_SET);
public V get() throws InterruptedException, ExecutionException {
if (slot.get() == NOT_SET) {
synchronized(this) {
while (slot.get() == NOT_SET) {
wait();
}
}
}
return slot.get();
}
public void set(V value) {
if (slot.get() == NOT_SET) {
if (slot.compareAndSet((V)NOT_SET, value)) {
synchronized(this) {
notifyAll();
}
}
}
}
}
Оригиналсм. так же
Годная статья
Комментариев нет:
Отправить комментарий