2010-04-22 176 views
5

线程完成后,使用start()方法不能再运行一次:它会抛出一个异常。谁能解释一下,为什么?这样的架构决定背后有什么?线程只运行一次

回答

7

因为在单独线程中执行代码的方式不是创建一个线程,该线程链接到什么是线程的系统视图(有关绿色和系统线程之间区别的详细信息),而是创建一个Runnable,并由线程执行。

为了获得最佳代码(因为创建线程非常耗时),我甚至会建议您不要直接让线程执行Runnable,而是使用ExecutorService,这样可以让您无需使用线程池困扰所有这些细节。

+0

是的! ExecutorService是狗屎,它也可以处理BlockingQueue。 – 2010-04-22 08:10:25

2

最终,线程活着,然后它死亡。毕竟,Thread对象只是下面真实操作系统线程的代理。如果你想要另一个喜欢它,请创建一个新实例。不要试图复活亡灵!

0

从架构的角度来看更糟糕的是,如果线程没有完成,你必须任意杀死它以阻止它执行。

如果您希望它多次执行一个例程,请在run()方法内放置一个循环。您可以使用回调方法将数据/信号发送回调用线程,并在发生时对它们做出反应。

+0

我不想知道,如何解决这个问题,我只想知道,为什么。 – folone 2010-04-22 08:21:59

5

当一个线程完成后,你不能 来看,这一次,使用的start() 方法:

更正:您可以拨打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