1

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

Я ищу для обработки прерывания потока при прерывании и завершении работы сервера. Я хочу знать, правильно ли это происходит.

class LoadingModule{    // Thread is started from here 
    threadsStartMethod() { 
     Thread t = new Thread(FileParseTask); 
     t.setDaemon(true); 
     t.start(); 
    } 
} 

Class FileParseTask implements Runnable { 

    @Override 
    public void run() { 
     try { 
      while(!Thread.currentThread.isInterrupted) { 
       // poll for file creation 
       // parse and store 
      } 
     } catch(Exception exit) { 
      log.error(message); 
      Thread.currentThread.interrupt(); 
     } 
    } 
} 

будет ли это чисто выходить из потока во всех сценариях?

ответ

1

это будет зависеть от кода внутри цикла. Если код внутри цикла захватывает прерванное исключение и восстанавливается, вы его никогда не увидите. Также общее исключение «exit» скрывает другие исключения. Измените код, чтобы вы знали, что вас поразило.

Я хотел бы сделать следующее

Class FileParseTask implements Runnable { 

    @Override 
    public void run() { 

      while(!Thread.currentThread.isInterrupted) { 
       try { 
       // poll for file creation 
       // parse and store 
       } catch(Exception exit) { 
        if (InterruptedException) 
         break; 
        else{ 
         // 
        } 
        log.error(message); 
       } 
      } 
    } 
} 

Это работает для меня до 2K нитей без проблем

+0

мне нужно вызвать Thread.CurrentThread.interrupt() в блоке поймать, чтобы сделать установить флаг прерывания в true? ИЛИ делает while (! Thread.CurrentThread.isinInterrupted) автоматически получает значение как истинное при некотором прерывании? –

+0

Наверное, нет. если вы находитесь внутри блока if (instanceof Interruptedexception), я думаю, что у вас достаточно информации, чтобы вырваться из цикла. Также вы можете проверить состояние текущего потока, если вам нужно – efekctive

+0

, почему вызывать прерывание() из catch http://stackoverflow.com/questions/4906799/why-invoke-thread-currentthread-interrupt-when-catch-any- interruptexception –

Смежные вопросы