我想知道如何在这样的代码中停止由一个“父”线程创建的线程。
public class HiloEspecie extends Thread{
private Especie especie;
private Procreador pro;
public HiloEspecie(Especie especie, Procreador pro){
this.especie = especie;
this.pro = pro;
}
public void run() {
while(!pro.isEmpty()){
pro.procrear(especie.getIcon(), especie.getTiempoReproduccion());
HiloEspecie hijo = new HiloEspecie(especie, pro);
hijo.start();
}
}
}
/* 如果我需要一个用于“hijo”线程的数组,你能告诉我吗?或者可能是一个 threadPool 以便在之后停止它们,或者我怎样才能停止它们
/* 编辑: 谢谢你给我的所有提示,我实际上设法使用 ThreadGroup 解决了它,java 自动将相同的 ThreadGroup 分配给由其他线程创建的线程,所以我需要做的就是创建一个新的 ThreadGroup 并将其分配给默认情况下,“父亲”线程和他的所有“儿子”都包含在同一个线程组中,最后(小心地)执行 (ThreadGroup)xxyy.stop();将停止所有线程,包括“父”线程。
最佳答案
您需要对线程的引用,然后您可以做“某事”来停止它。例如,将它们存储在列表或数组中。
请注意,您不应该调用 Thread.stop()
方法 - 您应该简单地中断线程,并以通过停止它本身来响应中断的方式实现线程尽可能快地完成。
一个更简洁的替代方案是将线程管理委托(delegate)给 ExecutorService
,例如Executors.newFixedThreadPool(numThreads)
:当您向 ExecutorService
提交一个 Runnable
或 Callable
时,您会得到一个Future
,您可以根据需要取消。
如果你想让任务提前结束,你仍然需要写Runnable
或Callable
来检查中断,并用future.cancel(真)
。
这意味着您正在“取消任务”,而不是“停止线程”。区别很微妙。 Future
的级别更高,使用起来也更好。一方面,您避免了为每个子任务创建新线程的开销,因为可以重复使用同一个线程。
但是您仍然需要存储对 Future
的引用,例如在数组或列表中。
关于java - 创建更多线程的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37562174/