2016-04-17 3 views
-1

Я пытаюсь убить нить, которая висит из-за тяжелой операции ввода-вывода. я мог бы попробовать thread.destroy или thread.stop, но они устарели Например, посмотрите на ниже кодКак убить витую нить в java

public class ThreadCheck { 
private static int cnt = 0; 
public static void main(String args[]) throws InterruptedException, ExecutionException { 
    Thread t1 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("Running tasks"); 
      while (condition)        { 
       // **** Some IO operation that take forever ****     
       System.out.println("iteration " + cnt++); 
       if (Thread.currentThread().isInterrupted()) { 
        System.out.println("Breaking loop"); 
        return; 
       } 
      }   
     } 
    }); 
    t1.start(); 
    TimeUnit.SECONDS.sleep(5); 
    t1.interrupt(); 
    System.out.println("thread destroyed.."); 

    } 
} 

Проблема в том, я добавил interrupt вызов, но он никогда не заканчивает IO вызов, так что я могу убить нить в таком случай

+1

Это зависит от точных операций ввода-вывода. Если вы, например, можете изменить свой код, чтобы использовать 'InterrptibleChannel', вы сможете достичь того, что вам нужно. Во всяком случае, операция ввода-вывода имеет важное значение для того, чтобы это было подотчетно. – RealSkeptic

+0

Да, что он ^^^^ сказал! –

+0

@RealSkeptic Я читаю некоторые CSV-файлы и вставляю данные из них в базу данных, но иногда эти файлы CSV повреждаются, а вызов IO никогда не заканчивается, в этом случае java имеет любую реализацию, с помощью которой я могу убить поток, как в команде unix kill – Nomad

ответ

0

Попробуйте следовать этой технологии, упомянутые в этом page:

Как остановить поток, который ждет Ф.О. r длительных периодов (например, для ввода)?

Для этого нужен метод Thread.interrupt. Же «состояние на основе» сигнальный механизм показанной выше, может быть использован, но изменение состояния (блинкер = NULL, в предыдущем примере) может сопровождаться вызовом Thread.interrupt, чтобы прервать ожидание:

public void stop() { 
    Thread moribund = waiter; 
    waiter = null; 
    moribund.interrupt(); 
} 

для работы этого метода, очень важно, что любой метод, который ловит прерывания исключения и не готов иметь дело с этим сразу вновь утверждает исключение. Мы говорим повторно, а не rethrows, , потому что не всегда возможно перестроить исключение. Если метод, который ловит InterruptedException не объявлен, чтобы бросить это (проверено) исключения, то он должен «reinterrupt себя» с следующим заклинанием:

Thread.currentThread().interrupt(); 

Это гарантирует, что поток будет ререйз InterruptedException как скоро, как это возможно.

Что делать, если нить не отвечает на Thread.interrupt?

В некоторых случаях вы можете использовать специальные трюки приложения. Например, , если поток ожидает в известном сокете, вы можете закрыть сокет до , чтобы поток немедленно возвращался. К сожалению, действительно есть - это не какая-либо техника, которая работает вообще. Следует отметить, что в все ситуации, когда ожидающий поток не отвечает на Thread.interrupt, он также не ответил на Thread.stop. Такие случаи включают в себя преднамеренные атаки типа «отказ в обслуживании» и операции ввода-вывода , для которых thread.stop и thread.interrupt не работают должным образом.

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