public class Solution {
public static void main(String[] args) throws InterruptedException {
TestThread testThread = new TestThread();
testThread.start();
Thread.sleep(3000);
testThread.interrupt();
}
public static class TestThread extends Thread {
public void run(){
Thread current = Thread.currentThread();
while (!current.isInterrupted()){
try {
Thread.sleep(1000); //IDEA подсказывает, что ошибка здесь, но я не понимаю что не так?
System.out.println("Tik-Tak");
}
catch (InterruptedException e){
e.printStackTrace();
current.interrupt();
}
}
}
}
}
Вывод:
Tik-Tak
Tik-Tak
java.lang.InterruptedException: sleep interrupted
at java.base/java.lang.Thread.sleep(Native Method)
at com.company.Solution$TestThread.run(Solution.java:16)
Anton
27 уровень
Не пойму в чём ошибка
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Grock
18 февраля 2024, 19:38
Судя по всему, ты создаешь экземпляр класса TestThread, унаследованный от Thread, т.е. создаешь поток.
Далее в потоке main запускаешь поток testThread.
Потом усыпляешь поток main на 3 секунды.
В это время поток testThread каждую секунду выдает "Tik-Tak".
Когда просыпается поток main ты прерываешь из него поток testThread.
В этом случае выбрасывается исключение (читай описание метода sleep):
InterruptedException – if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
Нельзя исключать также вероятность того, что исключение выбрасывается из-за того, что ты прерываешь поток testThread в момент, когда он спит (читай описание исключения InterruptedException):
Thrown when a thread is waiting, sleeping, or otherwise occupied, and the thread is interrupted, either before or during the activity. Occasionally a method may wish to test whether the current thread has been interrupted, and if so, to immediately throw this exception. The following code can be used to achieve this effect:
Далее ты печатаешь стек-трейс исключения (e.printStackTrace()), а вот зачем тебе current.interrupt();, если поток testThread уже прерван я не понимаю.
0
Anton
19 февраля 2024, 08:22
current.interrupt(); я добавил в попытке убрать ошибку (наобум), т.к. не понимаю что не так с кодом. Без current.interrupt(); ошибка не уходит.
0
Anton
19 февраля 2024, 09:41
Если закоментить e.printStackTrace();, то всё работает. Но не могу понять, почему выскакивает исключение?
0
Grock
19 февраля 2024, 11:01решение
Ты ловишь исключение в catch (InterruptedException e) и печатаешь e.printStackTrace(). Убирая e.printStackTrace() ты не убираешь исключение, а просто его не печатаешь.
Причину почему выскакивает исключение я указал выше: ты прерываешь в потоке main поток testThread (с помощью метода testThread.interrupt()), из-за чего выскакивает исключение, которое ты ловишь.
В данном случае исключение это не ошибка. Поток не так уж просто прервать. Вызывая interrupt() ты ловишь исключение и можешь его обработать. Это такой способ контролируемого прерывания потока.
В теле catch (InterruptedException e) ты прописываешь что произойдет, когда ты попытаешься прервать поток. При этом сам метод interrupt() не прерывает поток, а просто сбрасывает флаг (boolean поле) interrupted у соответствующего потока и присваиваешь ему "true" как сигнал, что поток прерван.
+2
Anton
20 февраля 2024, 11:07
Спасибо! Сохраню себе! А то я пол вечера просидел, пытаясь "избавиться" от выскакивающего исключения ))
+1