当一个Thread完成后,你不能再使用start()方法再次运行它:它抛出一个Exception。谁能解释一下,为什么?这种架构决策背后的原因是什么?
答案 0 :(得分:7)
因为在单独的线程中执行代码的方法不是创建一个线程,该线程链接到什么是线程的系统视图(绿色和系统线程之间的区别有无穷无尽的细节),但创建一个Runnable,并由线程执行。
对于最佳代码(因为创建线程非常耗时),我甚至建议您不要直接让线程执行Runnable,而是使用ExecutorService执行,这样您就可以使用线程池没有打扰所有这些细节。
答案 1 :(得分:5)
线程完成后,你不能 使用start()再次运行它 方法:
更正:每个实例只能调用Thread.start()
一次,任何后续调用都会抛出异常,无论线程是否仍在运行。
在运行完成后允许“重启”(当线程仍在运行时显然是错误)将需要额外的逻辑,并且会阻止运行时释放类似线程堆栈的资源(这是一个大量的内存)直到实例被垃圾收集;现在的方式,一旦线程结束就可以释放它们。
答案 2 :(得分:2)
最终,线程存在,然后它就死了。毕竟,Thread
对象只是下面真实操作系统线程的代理。如果你想要另一个喜欢它,请创建一个新实例。不要试图复活亡灵!
答案 3 :(得分:0)
在架构意义上更糟糕的是如果线程永远不会完成,你必须任意杀死它以阻止它执行。
如果希望它多次执行例程,请在run()方法中放置一个循环。您可以使用回调方法将数据/信号发送回调用线程,并在它们发生时对它们作出反应。
答案 4 :(得分: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();
}
}
}
作为一个新手,这个链接有所帮助:
http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html