Заставьте ожидающий поток пропустить оставшуюся часть ожидания/продолжения

У меня есть сценарий, в котором у меня есть один поток, который зацикливается между ожиданием и выполнением задачи. Однако я хотел бы прервать ожидание потока (пропустить оставшуюся часть ожидания, если хотите) и продолжить выполнение задачи.

У кого-нибудь есть идеи, как это можно сделать?


person Hans    schedule 01.02.2012    source источник
comment
вы используете ожидание с тайм-аутом? или вы используете ожидание и уведомление?   -  person Guillaume    schedule 01.02.2012
comment
Я использую ожидание с тайм-аутом.   -  person Hans    schedule 01.02.2012
comment
Вы имеете в виду, что вы хотели бы, чтобы поток перестал ждать, когда что-то появится для него? Вам может быть лучше с правильно настроенным ExecutorService для такого рода вещей.   -  person andrewmu    schedule 01.02.2012


Ответы (3)


Вот для чего Thread.interrupt:

import java.util.Date;


public class Test {

    public static void main(String [] args) {
        Thread t1 = new Thread(){
            public void run(){
                System.out.println(new Date());
                try {
                    Thread.sleep(10000); // sleep for 10 seconds.
                } catch (InterruptedException e) {
                    System.out.println("Sleep interrupted");
                }
                System.out.println(new Date());
            }
        };

        t1.start();
        try {
            Thread.sleep(2000); // sleep for 2 seconds.
        } catch (InterruptedException e) {
            e.printStackTrace();  
        }
        t1.interrupt();
    }
}

Поток t1 будет спать только 2 секунды, так как его прерывает основной поток. Имейте в виду, что это прервет многие блокирующие операции, такие как ввод-вывод.

person Zeki    schedule 01.02.2012
comment
Ага. Thread.interrupt() будет прерывать wait() (все варианты), sleep(), а также все блокирующие операции ввода-вывода. Прерывание обычно используется, когда вы хотите отменить то, что делал поток. Однако, если вы хотите дождаться, когда произойдет что-то конкретное, вы должны использовать функцию wait()/notify(). Читайте о них в Учебнике по Java. - person pron; 01.02.2012

Я думаю, что вам нужно реализовать wait()/notify() ! проверьте это руководство: http://www.java-samples.com/showtutorial.php?tutorialid=306

Их там очень много! если вам нужен более конкретный случай, опубликуйте немного своего кода!

ваше здоровье

person Arthur Neves    schedule 01.02.2012

Вы можете использовать wait() и notify(). Если ваш поток ожидает, вам нужно возобновить его, вызвав notify() из другого потока.

person Josepanaero    schedule 01.02.2012