我想知道如何阻止一个"父亲"像这样的代码中的线程。
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分配给由其他线程创建的Thread,所以我需要做的就是创建并分配一个新的ThreadGroup给它"父"线程,然后他所有的儿子"默认包含在同一个ThreadGroup中,最后做(仔细)(ThreadGroup)xxyy.stop();将停止所有线程,包括"父亲"线程。
答案 0 :(得分:4)
你需要一个线程的引用,然后你可以做“某事”来阻止它。例如,将它们存储在列表或数组中。
请注意,您不应该调用Thread.stop()
方法 - 您应该简单地中断线程,并以这样一种方式实现线程:通过尽可能快地停止正在执行的操作来响应中断安全。
更清晰的替代方案是将线程管理委派给ExecutorService
,例如Executors.newFixedThreadPool(numThreads)
:当您向Runnable
提交Callable
或ExecutorService
时,会收到Future
,如果您愿意,可以取消{。}。
如果您希望任务提前结束,则仍需要编写Runnable
或Callable
来检查中断,并使用future.cancel(true)
取消该任务。
这意味着您正在“取消任务”,而不是“停止线程”。区别是微妙的; Future
只是更高级别,更好用。首先,您可以避免为每个子任务创建新线程的开销,因为重用了相同的线程。
但您仍需要存储Future
的引用,例如在数组或列表中。
答案 1 :(得分:0)
Java语言无法识别线程之间的任何父/子关系,但它确实有一些可能对您有所帮助:阅读java.lang.ThreadGroup
类。
每个线程都是线程组的成员,您可以interrupt()
一个ThreadGroup。如果你的线程都设计为在被中断时停止,并且它们都是同一个ThreadGroup的成员,那么你可以通过中断ThreadGroup来阻止它们。