终止线程复兴

时间:2011-03-23 20:56:30

标签: java thread-state

我在arraylist中存储了一堆线程对象。我希望能够随机启动这些线程。同一个线程可以多次启动。在我开始一个线程对象之前,我检查线程是否处于活动状态,以及它们是否具有NEW或TERMINATED状态。这个限制因为,我不想打扰'忙'线程。现在,对于新线程,这很好用。但对于TERMINATED线程,我得到一个例外。

当线程结束时,它不应该回到'新'吗?或者线程是“一次性的” - 就像使用一次并完成一样?

5 个答案:

答案 0 :(得分:2)

正如Thread.start()的文档中所说,“不止一次启动一个线程是不合法的。特别是,一旦完成执行,线程可能无法重启。”

最好保留Runnable个实例,并实现自己的逻辑,以便跟踪每个实例的执行完成情况。使用Executor可能是运行Runnables的最简单方法。

答案 1 :(得分:1)

你可能应该使用java.util.concurrent中提供的很棒的东西。根据您的描述,ThreadPoolExecutor听起来像是一件好事。

答案 2 :(得分:1)

这就是我这样做的方式

class GarbageDisposalThread extends Thread {
public void start() {
   try {
      super.start();
   } catch( IllegalThreadStateException e ) {
      this.arrayList.remove(this);
      this.arrayList.add( new GarbageDisposalThread( this.arrayList ));
   }
}
private GarbageDisposalThread() {
}
public GarbageDisposalThread( ArrayList<Whatever> arrayList ) {
   this.arrayList = arrayList;
   this.start();
}
public void run() {
   // whatever the code
}
private ArrayList<Whatever> arrayList = null;
}

就是这样! 您可以根据需要更改代码:P

答案 3 :(得分:0)

无法重新启动Java线程。

来自javadoc:

  

启动一个线程永远不合法   不止一次。特别是,a   一旦线程可能无法重新启动   已完成执行。

有关详细信息,请参阅Thread.start() javadoc。

还有其他方法可以完成您要做的事情。例如,您可以使用新的线程来继续在已完成执行的线程中完成的工作。您可能还想调查java.util.concurrent package

答案 4 :(得分:0)

来自另一篇文章......

您可以使用ThreadPoolExecutor,它允许您传递任务并让服务将线程分配给任务。任务完成后,线程将进入空闲状态,直到完成下一个任务。

因此,您不会重新启动线程,但您将重做/恢复任务。