Почему поток продолжает работать после того, как я установил флаг выполнения в false? - PullRequest
0 голосов
/ 21 июня 2019

У меня работает поток, когда флаг равен true, но когда я изменяю флаг на false, он не умирает.

public static void main(String[] args)
    {
        try
        {
            MyThread mt = new MyThread();
            mt.start();
            Thread.sleep(1000);
            mt.setRunning(false);
            System.out.println("set running false");
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }

    public static class MyThread extends Thread
    {
        private boolean isRunning = true;

        public boolean isRunning()
        {
            return isRunning;
        }

        public void setRunning(boolean isRunning)
        {
            this.isRunning = isRunning;
        }

        public void run()
        {
            System.out.println("run");
            while (isRunning == true){
            }
            System.out.println("run over!");
        }
    }

Я знаю, что определение «isRunning» как volatile решит проблему, но когда не является volatile, «isRunning» не должен быть виден в какой-то момент в MyThread?

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Это связано с видимостью.

Сделайте вашу переменную изменчивой:

volatile private boolean isRunning = true;

Подробнее см. Что такое ключевое слово volatile для .

Я знаю, что определение isRunning как volatile решит проблему, но когда не изменчив, isRunning не должен быть виден в какой-то момент MyThread

Это изменение значения isRunning, которое необходимо сделать видимым для MyThread, когда поток main изменит его. В противном случае он может просто продолжить видеть кэшированное значение true.

0 голосов
/ 21 июня 2019

Здесь есть две темы.Каждый поток имеет кеш.Когда вы не добавляете volatile, поток считывает значение из кэша владельца.Итак, myThread.isRunning верно.Используя volatile, поток-владелец может принудительно записывать в память и обновлять кэш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...