Поток запускается только один раз - PullRequest
5 голосов
/ 22 апреля 2010

Когда поток завершен, вы не можете запустить его еще раз, используя метод start (): он вызывает исключение. Кто-нибудь может объяснить, почему? Что стоит за таким архитектурным решением?

Ответы [ 5 ]

7 голосов
/ 22 апреля 2010

Потому что способ выполнения кода в отдельном потоке состоит не в создании потока, который связан с системным представлением о том, что является потоком (существуют бесконечные детали различия между зелеными и системными потоками), а в создании Runnable , и он выполняется потоком.

Для оптимального кода (поскольку создание потоков занимает много времени), я бы даже рекомендовал вам не выполнять Runnable напрямую потоком, а ExecutorService , что позволит вам используйте пул потоков, не заботясь обо всех этих деталях.

5 голосов
/ 22 апреля 2010

Когда поток завершается, вы не можете запустить его еще раз, используя метод start ():

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

Разрешение «перезапуска» после его завершения (очевидно, это ошибка во время работы потока), потребует дополнительной логики, ибудет препятствовать тому, чтобы среда выполнения высвобождала ресурсы, такие как стек потоков (который представляет собой значительный объем памяти), до тех пор, пока экземпляр не будет собран мусором;как сейчас, их можно освободить, как только закончится поток.

2 голосов
/ 22 апреля 2010

В конце концов, нить живет, а затем умирает. В конце концов, объект Thread - это просто прокси для реального потока ОС внизу. Если вы хотите другого, как это, создайте новый экземпляр. Не пытайтесь воскресить нежить!

0 голосов
/ 27 октября 2013

Простая реализация для создания нескольких потоков:

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();
      }
   } 
}

Как новичок, эта ссылка помогла:

http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

0 голосов
/ 22 апреля 2010

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

Поместите цикл в метод run (), если хотитеэто выполнить процедуру более одного раза.Вы можете использовать метод обратного вызова для отправки данных / сигналов обратно в вызывающий поток и реагирования на них при их возникновении.

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