Когда поток завершен, вы не можете запустить его еще раз, используя метод start(): он выдает исключение. Может ли кто-нибудь объяснить, почему? Что стоит за таким архитектурным решением?Thread запускается только один раз
ответ
Поскольку способ выполнения кода, выполняемого в отдельном потоке, заключается не в создании потока, который связан с системным представлением того, что представляет собой поток (существуют бесконечные детали разграничения между зелеными и системными потоками), но для создания a Runnable, и попросите его выполнить Thread.
Для оптимального кода (поскольку создание потоков занимает много времени), я бы даже рекомендовал, чтобы вы не имели прямое выполнение Runnable потоком, а скорее ExecutorService, что позволит вам использовать пул потоков без беспокоиться обо всех этих деталях.
В конечном счете, нить живет, а затем она умирает. В конце концов, объект Thread
является просто прокси-сервером для реального потока ОС под ним. Если вы хотите другого подобного, создайте новый экземпляр. Не пытайтесь воскресить нежить!
Что еще хуже в архитектурном смысле, если нить никогда не закончилась, и вам пришлось произвольно убить ее, чтобы она не выполнялась.
Поместите цикл внутри метода run(), если вы хотите, чтобы он выполнял процедуру более одного раза. Вы можете использовать метод обратного вызова для отправки данных/сигналов обратно в вызывающий поток и реагировать на них, когда они возникают.
Я не хочу знать, как обойти это, я просто хочу знать, почему. – folone
Когда тема закончена, вы не можете запустить его еще раз, используя начало() метод:
Исправление: Вы можете вызвать Thread.start()
только один раз, например, любой последующий вызов будет бросаться исключение, независимо от того, продолжает ли поток работать или нет.
Разрешение «перезапуска» после того, как оно завершено (это явно ошибка, пока поток все еще работает) потребует дополнительной логики и будет препятствовать тому, чтобы среда выполнения освобождала ресурсы, такие как стек потоков (что является значительным количеством память), пока экземпляр не будет собран мусором; как это происходит сейчас, они могут быть освобождены, как только закончится нить.
Простая реализация для создания нескольких потоков:
import java.io.*;
class PWD extends Thread {
public void run() {
System.out.println(System.getProperty("user.dir"));
return;
}
}
public class HelloMultithread extends Thread{
public static void main(String[] args) throws java.io.IOException {
for(int i = 0; i < 10; i++){
PWD p = new PWD();
p.start();
}
}
}
Как Newbee, эта ссылка помогло:
http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
- 1. Thread работает только один раз
- 2. Thread, выполняемый только один раз
- 3. Функция запускается только один раз
- 4. jQuery запускается только один раз
- 5. Наблюдатель запускается только один раз
- 6. NSTimer запускается только один раз
- 7. setInterval только запускается один раз
- 8. Почему Thread run только один раз
- 9. Код jQuery запускается только один раз
- 10. Мой AJAX запускается только один раз,
- 11. сценарий jQuery запускается только один раз
- 12. Событие Xamarin AnimationEnd запускается только один раз
- 13. Backbone.View.model.on ('change: ...') запускается только один раз
- 14. Функция Javascript запускается только один раз
- 15. Почему MapView onTouchListener запускается только один раз?
- 16. Событие Click запускается только один раз
- 17. Уведомление WooCommerce, запускается только один раз
- 18. Выполнение некоторого кода запускается только один раз
- 19. для цикла запускается только один раз - javascript
- 20. JavaScript setInterval только запускается один раз
- 21. Код VBA успешно запускается только один раз
- 22. Событие jQuery .change() запускается только один раз
- 23. Почему AS3 navigateToURL() запускается только один раз?
- 24. Событие JavaFX TableView запускается только один раз?
- 25. Функция события JS запускается только один раз
- 26. JDialog WindowOpened событие запускается только один раз
- 27. Qthread calls запускается только один раз
- 28. Почему bme280.startreadout() запускается только один раз?
- 29. LinkedList .Add() запускается только один раз
- 30. Таймер запускается только один раз в python
Да! ExecutorService - это дерьмо, он также может обрабатывать BlockingQueue. –