Как использовать Java Thread.currentThread (). Interrupt () - PullRequest
0 голосов
/ 07 мая 2018

если я переопределю свою функцию запуска как,

Thread t = new Thread(){
                public void run(){
                    try {
                        if(Thread.currentThread().isInterrupted()) {
                            doSomePrcocess() // is the isInerrupted() flag seeting to true?
                            return; //Terminates the current Thread
                        }
                        //otherwise 
                        runScript();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            t.start();

, а затем, если я вызову Thread.currentThread().interrupt() из любой точки кода, должен ли поток остановиться там и начать выполнение doSomeProcess () в этой точке? если да, то как прерванный флаг может установить значение true? Если нет, как это сделать?

Ответы [ 3 ]

0 голосов
/ 07 мая 2018
  • Если поток находится в состоянии ожидания или ожидания, вызывая метод interrupt () для потока, прерывает состояние ожидания или ожидания

бросая InterruptedException

  • Если поток не находится в состоянии ожидания или ожидания, вызов Метод interrupt () выполняет нормальное поведение и не прерывает поток, а устанавливает для флага прерывания значение true.

Класс потока имеет возможность обрабатывать прерывание потока как

public void interrupt()
public static boolean interrupted()
public boolean isInterrupted()

Если вы намереваетесь выполнить однократное выполнение doSomePrcocess, вам необходимо выполнить проверку и очистить состояние прерывания потока для последовательных вызовов.

public static boolean interrupted()

Использование ниже будет только проверять статус и без изменений.

public boolean isInterrupted()
0 голосов
/ 19 августа 2018

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

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

public class InterruptTest {

    public static void main(String[] args) throws InterruptedException {

        Thread t = new Thread() {
            public void run() {
                while (true) {
                    try {

                        if (Thread.currentThread().isInterrupted()) {
                            doSomePrcocess(); // is the isInerrupted() flag seeting to true? - Yes
                            return; // Terminates the current Thread - yes
                        }
                        // otherwise
                        runScript();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }

            private void runScript() {
                System.out.println("runScript interrupted status:" + this.isInterrupted());
                sleepy(100);


            }

            private void doSomePrcocess() {
                System.out.println("doSomePrcocess interrupted status:" + this.isInterrupted());
                sleepy(500);
            }

            private void sleepy(int millis) {
                try {
                    Thread.sleep(millis);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Thread.currentThread().interrupt(); // try commenting this out to see what happens.
                }
            }
        };
        t.start(); 

        Thread.sleep(1000);

        t.interrupt(); // generally you would call interrupt on another thread.

    }

}
0 голосов
/ 07 мая 2018

Нет, так не работает. Метод isInterrupted проверяет, установлен ли флаг, он не объявляет обработчик. Невозможно определить центральный обработчик, который будет автоматически вызываться при прерывании потока. Что вы можете сделать, это перехватить InterruptedException и вызвать обработчик, а также регулярно проверять флаг прерывания, чтобы узнать, пора ли остановиться.

...