Страницы

Поиск по вопросам

пятница, 19 октября 2018 г.

Как удалить или остановить поток?

Как удалить или остановить поток, чтобы выполнить определенное действие и запустить (желательно удалить)?


Ответ

Все потоки нужно прерывать при помощи метода interrupt(). В самом потоке, который возможно будет прерван - нужно устанавливать проверки isInterrupted() во всех ключевых точках (где это необходимо) и обрабатывать соответственно. Ну это если в двух словах, а так лучше прочтите что-то по типу этой статьи на Хабре.
Состряпал пример:
import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;
public class Main { public static void main(String[] args) { final HelloThread helloThread = new HelloThread(); //final - для таймера helloThread.start();
Timer timer = new Timer(1000, new ActionListener() { @Override public void actionPerformed(ActionEvent event) { System.out.println("Interrupting thread..."); helloThread.interrupt(); } }); timer.setRepeats(false); timer.start(); System.out.println("Thread main still work");
} }
class HelloThread extends Thread { public void run() { try { for (int i = 0; i < 1000000; i++) { if (!isInterrupted()) {//isInterrupted проверять в любых ключевых точках, // где можно обработать прерывание потока if(i%5==1) System.out.println("Hello from a thread! " + i); } else { throw new InterruptedException(); //бросаем исключение в таких случаях как этот (циклы) } } } catch (InterruptedException e) { System.out.println("Thread is interrupted"); //Закрываем все стримы если есть }
//Не забывайте, что поток завершается когда нечего испонять System.out.println("Nothing to say"); //и окончательно он завершится после этой строки } }
Вообще в java doc не рекомендуют пользоваться deprecated методами (такими как Thread.stop()). Метод Thread.stop() убивает поток не обрабатывая и самое главное -
поток может быть «убит» во время выполнения операции, обрыв которой на полуслове оставит некоторый объект в неправильном состоянии, что приведет к появлению трудноотлавливаемой и случайным образом возникающей ошибке
(цитата из все той-же статьи на Хабре)

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

Отправить комментарий