День добрый.
Не смотря на то, что давольно давно пишу на Java, специалистом в области многопоточного программирования не являюсь. Поэтому хочу проконсультироваться у более опытных коллег.
Задача:
Есть некий класс, в многопоточном режиме обрабатывающий запросы (бизнес метод service). Нужно сделать метод остановки (назовем его destroy). Работать должно следующим образом:
Нужно сделать так, что бы после вызова метода destroy новые запросы не обрабатывались, обработка старых благополучно завершилась и после завершения последней обработки выполнились какие-то действия.
Я сделал так:
public class Worker{
AtomicBoolean flag;
AtomicInteger counter;
public void destroy() {
flag.set(true);
if (counter.get() == 0) {
destroyImpl();
}
}
public void service(String arg) {
if (!flag.get()) {
counter.incrementAndGet();
if (!flag.get()) {
serviceImpl(arg);
}
counter.decrementAndGet();
} else {
if (counter.get() == 0) {
destroyImpl();
}
}
}
}
Подозреваю что не только коряво, но и глючно.
Как правильно?