Каковы всевозможные возможности для приведения мертвой нити назад к runnable state.Как перезапустить мертвую нить?
ответ
Если вы посмотрите на жизнь Thread цикла изображения, нет никакого способа, вы можете вернуться в новое положение, как только ваш поток окончилась.
Не можете найти источник этого изображения? – Uooo
+1 хороший пост. @Uooo Откройте это [link] (http://faculty.inverhills.mnscu.edu/speng/cs1127/Notes/Ch23/LifeCycle.htm) и нажмите на диаграмму UML –
От JavaDocs ...
Он никогда не законно начать нить более чем один раз. В частности, поток не может быть перезапущен после завершения выполнения.
Вам нужно будет начать новый экземпляр.
Предпочтительно, чтобы действия, которые вы хотите выполнить, должны быть обернуты в интерфейс Runnable
, таким образом, вы можете просто передать Runnable
на новый экземпляр Thread
Когда выполнение прогона() метод является более, поскольку работа, о которой идет речь, делается, она доведена до мертвого состояния. Это делается неявно JVM. В мертвом состоянии объект потока - это сбор мусора. Это конец жизненного цикла нитки. Как только поток удаляется, его нельзя перезапустить снова (поскольку объект потока не существует).
Подробнее От Here о жизненном цикле Threads.
Я предполагаю, что вы расширили класс Thread
, и вы переопределили метод run
. Если вы это сделаете, вы привяжете исполняемый код к жизненному циклу Thread
. Поскольку Thread
не может быть перезапущен, вы должны создавать новый Thread
каждый раз. Лучшей практикой является разделение кода на выполнение в потоке из жизненного цикла Thread
с использованием интерфейса Runnable
.
Просто извлеките метод run
в класс, который реализует Runnable
. Затем вы можете легко перезапустить его.
Например:
public class SomeRunnable implements Runnable {
public void run(){
... your code here
}
}
SomeRunnable someRunnable = new SomeRunnable();
Thread thread = new Thread(someRunnable);
thread.start();
thread.join(); // wait for run to end
// restart the runnable
thread = new Thread(someRunnable);
thread.start();
Эта практика позволяет также легко, если вам нужно помнить предыдущее состояние выполнения.
public class SomeRunnable implements Runnable {
private int runs = 0;
public void run(){
runs++;
System.out.println("Run " + runs + " started");
}
}
PS: Используйте java.util.concurrent.Executor
выполнить Runnable
с. Это отменит управление потоками.
Executor executor = Executors.newSingleThreadExecutor();
...
SomeRunnable someRunnable = new SomeRunnable();
executor.execute(someRunnable);
Посмотрите на Executor Interfaces
нить представляет собой отдельный процесс, свет веса, который выполняет независимо друг от друга, независимо от других потоков. Как только его выполнение будет завершено, нет никаких средств для его перезапуска.
Резьба имеет много разных состояний благодаря своей жизни.
1 Новорожденных государственного
2 Runnable государственного
3 Запуск государственного
4 заблокированного состояние
5 Dead State
Тема должна быть в одном состоянии выше и могут перемещаться из одного состояния в другое различными способами и способами.
Когда поток завершается выполнение его метод Run() жизненный цикл этой конкретной нити конец.
Мы можем убить поток, вызвав метод stop() для данного потока и отправить его в состояние «Мертвое состояние».
Другое очевидное решение: если вам нужна функция потока много раз, не позволяйте нить умирать. Вместо того, чтобы позволить ему выйти и таким образом закончить себя, запишитесь в течение (истинного) цикла с подходящим ожиданием в верхней части. Затем вы можете заставить его «перезапустить» свою работу, сигнализируя об этом.
Это намного быстрее, безопаснее и эффективнее, чем постоянное создание/завершение/уничтожение потоков.
- 1. Java - Принесите мертвую нить обратно живой
- 2. Не удается перезапустить нить
- 3. Перезапустить бегущую нить
- 4. Как перезапустить нить, ни пауза, ни спать
- 5. Остановить и перезапустить уже запущенную нить
- 6. Как перезапустить нить или любое другое альтернативное решение
- 7. ZF2 - мертвую петлю
- 8. Как реализовать мертвую расчёт при повороте?
- 9. как перезапустить поток в android?
- 10. Как перезапустить Thread в C# .Net 4.0?
- 11. нить
- 12. git: удалить мертвую ветку после переустановки?
- 13. Сбор мусора Java, позволяющий мертвую память?
- 14. Как проверить, если Anonymous нить работает
- 15. Как остановить сиротскую нить в clojure REPL
- 16. Мульти нить рабочий статус нить
- 17. Как перезапустить приложение Cocos2D?
- 18. Как перезапустить приложение WPF?
- 19. Как перезапустить BluetoothLeScanner?
- 20. Как перезапустить фляжный сервер?
- 21. Как перезапустить мой код?
- 22. Как перезапустить phusion-пассажир?
- 23. Как перезапустить таймер?
- 24. Как перезапустить узел erlang?
- 25. Как безопасно перезапустить TortoiseSVN?
- 26. Как перезапустить ключи массива?
- 27. Как перезапустить сценарий?
- 28. Как перезапустить экземпляр BaseHTTPServer?
- 29. Как перезапустить скрипт?
- 30. Как перезапустить программу?
Нет! Вам гораздо лучше обматывать состояние вашего потока в объекте (возможно, «Runnable») и просто передавать этот объект в новый поток. – phs
Вы не можете перезапустить поток! –
Вам необходимо использовать передовые методы путешествия во времени. И вы должны избегать создания парадоксов ... например, когда поток возвращается вовремя и убивает свой родительский поток до его создания. –