线程只运行一次

时间:2010-04-22 08:01:30

标签: java multithreading exception

当一个Thread完成后,你不能再使用start()方法再次运行它:它抛出一个Exception。谁能解释一下,为什么?这种架构决策背后的原因是什么?

5 个答案:

答案 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