代码之家  ›  专栏  ›  技术社区  ›  George

线程只运行一次

  •  5
  • George  · 技术社区  · 14 年前

    当一个线程完成时,不能使用start()方法再次运行它:它抛出一个异常。有人能解释一下,为什么吗?这样一个架构决策背后的原因是什么?

    5 回复  |  直到 10 年前
        1
  •  7
  •   Riduidel    14 年前

    因为让代码在单独的线程中执行的方法不是创建一个线程,该线程链接到什么是线程的系统视图(关于绿色线程和系统线程之间的区别有无限的细节),而是创建一个 Runnable ,并让线程执行它。

    为了获得最佳代码(因为创建线程非常耗时),我甚至建议您不要直接让线程执行runnable,而应该由 ExecutorService ,这将允许您使用线程池,而不必考虑所有这些细节。

        2
  •  5
  •   Michael Borgwardt    14 年前

    当一根线完成时,你不能 使用start()再次运行它 方法:

    更正:你可以打电话 Thread.start() 每个实例只有一次,任何后续调用都将抛出异常,无论线程是否仍在运行。

    允许在运行完成后“重启”(这显然是线程仍在运行时的一个错误)将需要额外的逻辑,并将阻止运行时释放诸如线程堆栈(这是一个很大的内存量)之类的资源,直到实例被垃圾收集为止;现在的情况是,线程一结束就可以释放它们。

        3
  •  2
  •   Donal Fellows    14 年前

    最后,线活了,然后就死了。毕竟, Thread 对象只是下面真实操作系统线程的代理。如果你还想要一个类似的实例,就创建一个新实例。别想让亡灵复活!

        4
  •  0
  •   seanhodges    14 年前

    从架构的角度来说,更糟糕的是,如果线程从未完成,那么您必须任意杀死它以阻止它执行。

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

        5
  •  0
  •   Tom Howard vancexu    11 年前

    创建多个线程的简单实现:

    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