Social Icons

.

четверг, 8 мая 2014 г.

Использвоание wait/notify в JAVA

Пример корректного использования методов wait и notify класса Object для многопоточных задач.


Пусть есть поток А, которому необходимо остановиться и ожидать получения значения от потока В.
Решение. Хорошее решение использовать библиотеку 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();
                }
            }
        }
    }
}
Оригинал
см. так же
Годная статья 

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

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

 

Так говорил Учитель:

У хорошо написанной программы есть свой собственный рай, у плохо написанной — свой собственный ад.

Russian Developer

Взгляд его светел, усилия праведны, старания бесплодны, дело безнадежно ...