线程只运行一次

5

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

5个回答

7
因为在单独的线程中执行代码的方法不是创建一个线程,而是创建一个Runnable,并让它由Thread执行。这与系统对线程的视图有关(在绿色线程和系统线程之间有无数细节上的区别)。
对于最佳代码(因为创建线程很耗时),我甚至建议您不要直接让您的Runnable由线程执行,而是由ExecutorService执行,这将允许您使用线程池而不必担心所有这些细节。

是的!ExecutorService 真是太棒了,它还可以处理 BlockingQueue。 - Lars Andren

5
当一个线程完成后,您不能再次使用start()方法运行它。
更正:您只能对每个实例调用一次Thread.start(),任何后续调用都会抛出异常,无论线程是否仍在运行。
允许在线程完成运行后“重新启动”(这显然是一个错误,因为线程仍在运行)需要额外的逻辑,并且会阻止运行时释放资源(例如线程堆栈,这是相当大量的内存),直到实例被垃圾回收;现在的方式是,这些资源可以在线程完成后立即释放。

2

最终,线程存在一段时间后就会死亡。毕竟,Thread对象只是底层真实操作系统线程的代理。如果想要另一个类似的线程,请创建一个新实例。不要试图复活已经死亡的线程!


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


0

从架构角度来看,更糟糕的情况是线程永远不会完成,你必须任意杀死它才能停止执行。

如果您想要运行一个例程多次,请在run()方法中放置一个循环。您可以使用回调方法将数据/信号发送回调用线程,并在发生时对其进行反应。


我不想知道如何解决这个问题,我只想知道为什么。 - George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接