2013-05-23 3 views
1

Я запускаю ExecutorService для выполнения тяжелых вычислений, однако я не хочу загрязнять алгоритмический класс/метод с помощью операций runner, в этом случае я бы хотел сделать периодическую проверку, если его следует прекратить изящно.Killing Thread без периодической проверки живого состояния

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

Так что мой вопрос в том, есть ли какой-либо способ прекратить поток «снаружи» потока, вызвав некоторый принудительный попыток убить поток.

Если нет, возможно, лучшим решением является использование аспекта и перехват каждой итерации путем добавления проверки статуса убийства?

+0

Не можете ли вы прервать нить? – Lokesh

+0

Да, отметьте флаг. Возможно, вы можете обернуть код вычисления в другом классе, который взаимодействует с логикой планирования? – sje397

+0

Возможный дубликат [Как прекратить поток java изящно?] (Http: // stackoverflow.com/questions/3194545/how-to-stop-a-java-thread-gracefully) –

ответ

2

Вы можете позвонить по телефону thread.interrupt(). Это может привести к отключению потока, если он «соблюдает» прерывания. Например, если поток заблокирован на IO или на wait() или на sleep()InterruptedExcption будет выброшен. Однако, если он «заблокирован» в цикле занятости, который не проверяет isInterrupted(), прерывание флагов не будет работать.

Другой способ действительно убить поток - вызывать устаревший метод stop(). Однако это последняя возможность. Этот метод устарел, потому что он действительно убивает потоки немедленно (например, kill -9), что может вызвать утечку ресурсов.

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

1

Уверен, что это способ принудительно прекратить нить: Thread#stop, но это почти никогда не рекомендуется. Ваша идея с аспектами кажется весьма плодотворной, но если у вас есть какой-то основной цикл в вашей задаче, подумайте о замене цикла на ряд представленных задач, где каждая задача является одной итерацией. Это позволит ExecutorService#shutdown прервать обработку. Все состояние может переноситься в том случае, если подано Runnable.

0

Я не пользовался услугами Исполнителя. Но, читая JavaDocs, кажется, что вы отправляете вызываемые или выполняемые службы. Эти методы возвращают объект Future, который имеет на нем метод отмены.

cancel(boolean mayInterruptIfRunning) 

Вы пробовали использовать это?

0

Метод thread.interrupt() остановить поток, и вы можете вызывать его вне самого потока!

0

Если вы не хотите менять исходную реализацию, вы можете обернуть поток. Я не очень знаком с Java, поэтому я извиняюсь за явно не составителя, например:

class ThreadWrapper extends Thread { 
    public ThreadWrapper(Thread t, TerminateCallback c) { 
     // ... 
    } 

    @Override 
    public void run() { 
     t.start(Thread.SYNCHRONOUS); 
     c.done(this); 
    } 
} 

Вы должны были бы реализовать TerminateCallback себя. Я также предполагаю, что есть способ начать поток синхронно, Thread.SYNCHRONOUS - это просто место. Если это условие выполнено, я уверен, что вы можете перенести его в действительный код. :)

+0

У меня возникает ощущение, что я пропустил вопрос. :) –

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