Как использовать interrupt() в этом контексте

#java #multithreading

#java #многопоточность

Вопрос:

Если run () не завершен и вызывается извне, мне нужно сначала завершить запущенный фрагмент.

 public class EnvTime extends Thread {
    public void run() {
        long step = 2000 / benvelope1.length;
        while (!finished) {
            for (int i = 0; i < benvelope1.length; i  ) {
                envOut = benvelope1[i];
                try {
                    Thread.sleep(step);
                } catch (InterruptedException benvelope1) {
                    benvelope1.printStackTrace();
                }
            }
        }
    }
}
  

Итак, я вызываю этот код из другого метода с:

 Env interpol;

interpol.interrupt(); //

interpol=new EnvTime();

interpol.start();
  

Но это не работает…

Ответ №1:

Неясно, чего вы пытаетесь достичь, но, выполняя

 Env interpol;

interpol.interrupt(); //
  

вы, вероятно, получили бы NullPointerException . Если вы хотите, чтобы ваш код достигал

 } catch (InterruptedException benvelope1) {
    ...
}
  

вам нужно убедиться, что поток находится в try -блоке, особенно в Thread.sleep методе, когда вы его прерываете.

Другими словами, вам, по крайней мере, нужно запустить поток, прежде чем прерывать его.

Ответ №2:

Вам следует изменить finished где-нибудь в своем коде. Вот так:

         try {
            Thread.sleep(step);
        } catch (InterruptedException benvelope1) {
            finished = true;
            benvelope1.printStackTrace();
        }
  

Возможно, вам также следует дождаться, когда поток действительно завершится, прежде чем запускать новый. Используйте join:

 interpol.interrupt(); 
interpol.join();
interpol=new EnvTime();
interpol.start();
  

Комментарии:

1. спасибо, я попробую это. по какой-то причине я не могу дождаться завершения потока. Мне нужно принудительно завершить