2010-04-22 3 views
5

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

ответ

7

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

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

+0

Да! ExecutorService - это дерьмо, он также может обрабатывать BlockingQueue. –

2

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

0

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

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

+0

Я не хочу знать, как обойти это, я просто хочу знать, почему. – folone

5

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

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

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

0

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

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

Смежные вопросы