Я пробовал пример 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();
}
}
}
Если мне не изменяет память, java имеет довольно длительные периоды между переключениями потоков, поэтому возможно, что isAlive завершится неудачно, потому что поток еще не жив. Попробуйте добавить время ожидания между thread.start () и thread.isAlive ()
Существует большая вероятность того, что поток будет запущен, выполнен и завершен между вашим вызовом start ()
и вашим вызовом isAlive ()
.
Java не дает никаких гарантий относительно последовательности, в которой эти вещи происходят. Он может выполнить порожденный поток немедленно или отложить его на более позднее время.
Между прочим, ваш код пытается перезапустить поток после того, как он умер. Это запрещено :
Запуск потока никогда не разрешен. больше чем единожды. В частности, поток не может быть перезапущен после того, как он завершил выполнение.
Таким образом, вызов start ()
после проверки isAlive ()
никогда не сработает.
Я не вижу смысла в опубликованном вами коде. Thread.start () запускает поток: вам не нужно запускать его дважды. Я не понимаю, как ваш код может реально оказаться в ситуации, когда у него есть поток, и он не знает, запущен он или нет; в любом случае есть множество способов обойти это, чтобы этого не могло произойти.
Я еще не использовал многопоточность в java, но мне кажется, что ваш поток, вероятно, будет запущен и завершится до проверки isAlive (). В конце концов, похоже, ваша нить просто что-то распечатывает, а затем умирает.