我在数组列表中存储了一堆线程对象。我希望能够随机启动这些线程。同一线程可以多次启动。在启动线程对象之前,我会检查线程是否处于活动状态,以及它们是否具有 NEW 或 TERMINATED 状态。这个限制是因为,我不想打扰“忙碌”的线程。现在,对于新线程,这工作正常。但是对于 TERMINATED 线程,我得到一个异常。
当一个线程结束时,它不应该回到“新”状态吗?或者线程是“一次性的” - 就像使用一次就完成了?
我在数组列表中存储了一堆线程对象。我希望能够随机启动这些线程。同一线程可以多次启动。在启动线程对象之前,我会检查线程是否处于活动状态,以及它们是否具有 NEW 或 TERMINATED 状态。这个限制是因为,我不想打扰“忙碌”的线程。现在,对于新线程,这工作正常。但是对于 TERMINATED 线程,我得到一个异常。
当一个线程结束时,它不应该回到“新”状态吗?或者线程是“一次性的” - 就像使用一次就完成了?
正如Thread.start()的文档中所说,“多次启动线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。”
最好保留Runnable实例并实现自己的逻辑来跟踪每个实例的执行何时完成。使用Executor可能是运行 Runnables 的最简单方法。
您可能应该使用java.util.concurrent
. 根据您的描述,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
Java 线程无法重新启动。
从javadoc:
多次启动一个线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。
有关更多信息,请参阅Thread.start() javadoc。
还有其他方法可以完成您正在尝试做的事情。例如,您可以使用新的线程来继续在已完成执行的线程中完成的工作。您可能还想研究java.util.concurrent 包。
从另一个帖子...
您可以使用 ThreadPoolExecutor,它允许您传入任务并让服务将线程分配给任务。当任务完成时,线程进入空闲状态,直到它得到下一个任务。
因此,您不会重新启动线程,但会重做/恢复任务。