JavaRush /Java блог /Random UA /Переривання роботи нитки (interrupte thread)
Pegas
34 рівень
Гродно

Переривання роботи нитки (interrupte thread)

Стаття з групи Random UA
Накидав два класи, що успадковуються від Runnable. Вони проста начинка (Thread.sleep і sout). Я вивчав питання переривання роботи ниток за допомогою interruptedта isInterrupted. Чомусь переривання не відбувається, а виконання програми зациклюється та вилітає помилка: Переривання роботи нитки (interrupte thread) - 1
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.codegym.test.myExample.example.thread.Producer.run(Producer.java:15)
	at java.lang.Thread.run(Thread.java:745)
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.codegym.test.myExample.example.thread.Consumer.run(Consumer.java:15)
	at java.lang.Thread.run(Thread.java:745)
Після вильоту помилки робота ниток продовжується нескінченно. Але якщо прибрати з класів, що успадкувалися від Runnable, виклик Thread.sleep, то програма відпрацьовує нормально. У чому проблема, чому вилітає помилка і чому не завершується робота програми? Ось main:
public class Solution
{
    public static void main(String[] args) throws InterruptedException
    {
        Thread thread1 = new Thread(new Producer());
        Thread thread2 = new Thread(new Consumer());

        thread1.start();
        thread2.start();

        Thread.sleep(1500);

        thread1.interrupt();
        thread2.interrupt();
    }
}
Перший клас:
public class Producer implements Runnable
{
    @Override
    public void run()
    {
        while (!Thread.interrupted())
        {
            try
            {
                Thread.sleep(100);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            System.out.println("Producer");
        }
    }
}
Другий клас:
public class Consumer implements Runnable
{
    @Override
    public void run()
    {
        while (!Thread.interrupted())
        {
            try
            {
                Thread.sleep(100);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            System.out.println("Consumer");
        }
    }
}
Дякуємо за коментарі до теми)
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ