我在一个数组列表中存储了一堆线程对象。我希望能够随机启动这些线程。同一个线程可以多次启动。在我启动一个线程对象之前,我检查线程是否存在,以及它们是否具有NEW或TERMINATED状态。这个限制是因为我不想打扰'繁忙'的线程。现在,对于新线程,这工作正常。但对于TERMINATED线程,我得到一个异常。终止的线程复兴
当线程结束时,是不是应该回到'新'?或者线程是“一次性的” - 就像使用一次就完成了一样?
我在一个数组列表中存储了一堆线程对象。我希望能够随机启动这些线程。同一个线程可以多次启动。在我启动一个线程对象之前,我检查线程是否存在,以及它们是否具有NEW或TERMINATED状态。这个限制是因为我不想打扰'繁忙'的线程。现在,对于新线程,这工作正常。但对于TERMINATED线程,我得到一个异常。终止的线程复兴
当线程结束时,是不是应该回到'新'?或者线程是“一次性的” - 就像使用一次就完成了一样?
正如它在Thread.start()的文档中所述,“多次启动线程永远不合法,特别是一旦线程完成执行,它可能不会重新启动。”
您最好保留Runnable实例并实现自己的逻辑,以便跟踪每个实例的执行时间。使用Executor可能是运行Runnables的最简单方法。
您应该使用java.util.concurrent
中提供的可怕东西。根据您的描述,ThreadPoolExecutor
听起来像是一件好事情。
true true - 我一定会试一试 - 非常感谢 – moejoe 2011-03-23 23:16:43
Java线程无法重新启动。
根据JavaDoc:
这是从来没有的法律,以启动一个线程 不止一次。特别是,一旦 完成执行, 线程可能无法重新启动。
查看Thread.start() javadoc了解更多信息。
还有其他方法可以完成您正在尝试做的事情。例如,您可以使用新的线程来继续在已完成执行的线程中完成的工作。您可能还想调查java.util.concurrent package。
从另一个帖子...
你可以使用ThreadPoolExecutor的,这将让你在任务中传递,让服务分配一个线程的任务。任务完成后,该线程将处于空闲状态,直到获得下一个任务。
所以,你不重启一个线程,但你会重做/恢复一个任务。
这是我做的
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
这实际上是在创建一个新的线程就地的旧的......不完全就地(但你可以修改代码一点点去做!) – Aurangzeb 2012-06-07 15:04:07
可能重复[可以在死亡后再次启动线程?](http://stackoverflow.com/questions/5398459/can-i-start-一个线程再次死后) – dty 2011-03-23 21:11:15
@Hank这是真的 - 谢谢你的链接。 – moejoe 2011-03-23 23:14:30