iKapex
@iKapex

Как прекратить выполнение thread'ов?

Всякий раз, когда вызываю функцию
addMessage()
я создаю новые thread's. В этих threads я просто делаю:
Thread.sleep(5000);
Что я хочу сделать: мне нужно подождать когда этот threads проснется и запустить определенный метод (deleteMessage() )ТОЛЬКО один раз. А у меня получается, что сколько раз я вызываю функцию addMessage, столько раз я и вызываю deleteMessage(). Я пробовала делать треду interrupt(), пробовала делать join(). У меня ничего не выходит.
Как можно решить эту задачу?
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
@igorcc
Доброго вечера. Тут все подробно расписано.
docs.oracle.com/javase/1.5.0/docs/guide/misc/threa...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rulexec
@Rulexec
Метатеоретик теории типов
Обычно не убивают потоки извне, ибо это может привести к неопределённым последствиям.

Чтобы сделать что-то один раз из множества потоков, можно использовать, к примеру, атомарные булеаны.

Создаём инстанс AtomicBoolean, ссылку на который имеют все эти потоки, который изначально будет false.

Затем делаем CAS:

// AtomicBoolean isDeleted;
if (isDeleted.compareAndSet(false, true)) {
    deleteMessage();
}


compareAndSet принимает ожидаемое значение и если оно действительно такое — изменяет флаг на то что мы хотим и возвращает true, если мы угадали, иначе false. И делается это атомарно. Т.е. только один поток изменит переменную и получит true и вызовет deleteMessage.

Но вообще, для этой задачи похоже вряд ли нужно действительно создавать потоки. Возможно вам нужна просто переменная, мол, «есть ли сейчас таймер, который вызовет deleteMessage», а так же Timer, который вызовет deleteMessage через какое-то время. Его и отменить можно, если что.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы