Как удалить или остановить поток, чтобы выполнить определенное действие и запустить (желательно удалить)?
Ответ
Все потоки нужно прерывать при помощи метода 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() убивает поток не обрабатывая и самое главное -
поток может быть «убит» во время выполнения операции, обрыв которой на полуслове оставит некоторый объект в неправильном состоянии, что приведет к появлению трудноотлавливаемой и случайным образом возникающей ошибке
(цитата из все той-же статьи на Хабре)
Комментариев нет:
Отправить комментарий