isAlive () метод потока Java не работает правильно?

Я пробовал пример isAlive() метод поточной обработки Java. Но я нашел это isAlive() метод возвращается false даже если поток был уже запущен. Кто-то может сказать мне, что я делаю неправильно? Вот фрагмент кода.

package app;

public class ThreadAliveDemo {

    public static void main(String[] args) {

        Thread myThread;

        myThread = new Thread()
        {
            public void run()
            {
                            Thread.sleep(3000);
                System.out.println("My Thread.");
            }
        };

        myThread.setName("My Thread");
        myThread.start();

        if(!myThread.isAlive())
        {
            myThread.setName("My Thread");
            myThread.start();
        }

    }

}
5
задан Rise 29 June 2010 в 12:56
поделиться

4 ответа

Если мне не изменяет память, java имеет довольно длительные периоды между переключениями потоков, поэтому возможно, что isAlive завершится неудачно, потому что поток еще не жив. Попробуйте добавить время ожидания между thread.start () и thread.isAlive ()

3
ответ дан 18 December 2019 в 11:52
поделиться

Существует большая вероятность того, что поток будет запущен, выполнен и завершен между вашим вызовом start () и вашим вызовом isAlive () .

Java не дает никаких гарантий относительно последовательности, в которой эти вещи происходят. Он может выполнить порожденный поток немедленно или отложить его на более позднее время.

Между прочим, ваш код пытается перезапустить поток после того, как он умер. Это запрещено :

Запуск потока никогда не разрешен. больше чем единожды. В частности, поток не может быть перезапущен после того, как он завершил выполнение.

Таким образом, вызов start () после проверки isAlive () никогда не сработает.

11
ответ дан 18 December 2019 в 11:52
поделиться

Я не вижу смысла в опубликованном вами коде. Thread.start () запускает поток: вам не нужно запускать его дважды. Я не понимаю, как ваш код может реально оказаться в ситуации, когда у него есть поток, и он не знает, запущен он или нет; в любом случае есть множество способов обойти это, чтобы этого не могло произойти.

0
ответ дан 18 December 2019 в 11:52
поделиться

Я еще не использовал многопоточность в java, но мне кажется, что ваш поток, вероятно, будет запущен и завершится до проверки isAlive (). В конце концов, похоже, ваша нить просто что-то распечатывает, а затем умирает.

1
ответ дан 18 December 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: