Пробудить нить ото сна

Я впервые создаю программу и подробно работаю с потоками и застрял в ситуации. Пожалуйста, помогите мне в этом. У меня есть поток, который находится в состоянии ожидания. Теперь в какой-то момент я хочу убить или разбудить поток и возобновить работу из другого класса. Для этого я сохраняю объект потока. Я не знаю, как это сделать. Я пытался чтобы уведомить поток, но получил исключение. Вот мой код:

Первый класс:

Thread t= new Thread(new Runnable() {      
    @Override
    public void run() {
        try{  
            Thread.sleep(VariableClass.THREAD_WAIT_SECONDS);
            if(message !=null)
            message_status = message.getStatus();
        }
        catch(InterruptedException e)
        {
            e.printStackTrace();
        }
        //do other stuff and save the thread object
        VariableClass.threads.remove(message.getUniqueId());
    }
});
t.start();
VariableClass.threads.put(pojo.getUniqueId(),t);

Второй класс:

Thread t =VariableClass.threads.get(tempId);
t.notify();

Я просто хочу возобновить или убить нить.


person Bansal_Sneha    schedule 28.05.2015    source источник
comment
я думаю, вы должны использовать t.interrupt()   -  person SpaceTrucker    schedule 28.05.2015
comment
Это может быть пример проблемы XY (мета .stackexchange.com/questions/66377/what-is-the-xy-problem) Какова ваша настоящая цель? Если вы хотите передать сообщение из одного потока в другой, возможно, вам следует использовать какую-то очередь (например, java.util.concurrent.SynchronousQueue или `java.util.concurrent.BlockingQueue).   -  person Solomon Slow    schedule 28.05.2015


Ответы (3)


Если ваш поток t находится в спящем режиме, вызов t.interrupt() вызовет исключение InterruptedException из строки, вызывающей Thread#sleep. Он попадет в ваш блок catch, и ваш поток продолжит оттуда, чтобы выполнить свою очистку и выйти.

Если возникла проблема, из-за которой ваш поток не спал и не ожидал, но все же хотел знать, был ли он прерван, код в вашем Runnable мог проверить флаг прерывания в текущем потоке. Помните, что флаг прерывания сбрасывается после создания InterruptedException.

Подождите и уведомите для потоков, которые синхронизируются на мониторе, это не применимо к вашему примеру. Потоки ждут на мониторе и получают уведомления, но уведомления не направляются конкретному потоку; для Object#notify выбирается некоторый поток, ожидающий на этом мониторе, но поток, вызывающий уведомление, не имеет контроля над тем, какой из них выбран.

Вот пример использования прерывания для вывода потока из спящего режима.

person Nathan Hughes    schedule 28.05.2015

Ваш поток спит в течение указанного периода времени. Позовите на него interrupt, если вы просто хотите "убить его" и вам все равно, что с ним будет потом. Вы не можете просто «разбудить его» из другого потока, если он спит, он должен спать столько, сколько ему было сказано. Вызов notify не имеет ничего общего с этой ситуацией (нет предварительного вызова wait). Даже если это так, вы называете это неправильно.

person peter.petrov    schedule 28.05.2015

Вы не используете уведомление в этом случае. Я предлагаю прочитать JavaDoc на #wait/#notify/#notifyAll

Вы используете #notify и #notifyAll для создания фреймворка с параллелизмом, такого как поток, который работает с экземпляром определенного объекта, а другие потоки ожидают работы с ним.

Поток «умирает», если функция выполнения завершена, но если вы хотите немедленно остановить поток, используйте #interrupt.

person 0-4930-42390eo23o2e0-23oe0-23o    schedule 28.05.2015