Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建更多线程的线程_Java_Multithreading - Fatal编程技术网

Java 创建更多线程的线程

Java 创建更多线程的线程,java,multithreading,Java,Multithreading,我想知道如何在这样的代码中停止由一个“父”线程创建的线程 public class HiloEspecie extends Thread{ private Especie especie; private Procreador pro; public HiloEspecie(Especie especie, Procreador pro){ this.especie = especie; this.pro = pro; }

我想知道如何在这样的代码中停止由一个“父”线程创建的线程

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”线程的数组吗。或者一个线程池来阻止他们,或者我如何阻止他们

/*编辑::
谢谢你给我的所有提示,我实际上使用ThreadGroup解决了这个问题,java自动将同一个ThreadGroup分配给另一个线程创建的线程,所以我需要做的就是创建一个新的ThreadGroup并将其分配给“父”线程,然后默认情况下,他的所有“子”都包含在同一个ThreadGroup中,最后(小心地)(螺纹组)xxyy.stop();将停止所有线程,包括“父”线程。

您需要该线程的引用,然后可以执行“某些操作”来停止它。例如,将它们存储在列表或数组中

请注意,您不应该调用
Thread.stop()
方法-您应该简单地中断线程,并以这样一种方式实现线程,即通过尽可能快地停止正在执行的操作来响应中断


一个更干净的替代方法是将线程管理委托给
执行器服务
,例如
执行器。newFixedThreadPool(numThreads)
:当您向
执行器服务
提交
可运行的
可调用的
时,您会得到一个
未来的
,如果需要,您可以取消它

如果希望任务提前结束,您仍然需要编写
Runnable
Callable
来检查中断,并使用
future.cancel(true)
取消任务

这意味着您正在“取消任务”,而不是“停止线程”。区别是微妙的<代码>未来s只是级别更高一点,更易于使用。首先,您可以避免为每个子任务创建新线程的开销,因为相同的线程被重用


但是您仍然需要存储对
未来的
的引用,例如在数组或列表中。

您需要对线程的引用,然后您可以执行“操作”来停止它。例如,将它们存储在列表或数组中

请注意,您不应该调用
Thread.stop()
方法-您应该简单地中断线程,并以这样一种方式实现线程,即通过尽可能快地停止正在执行的操作来响应中断


一个更干净的替代方法是将线程管理委托给
执行器服务
,例如
执行器。newFixedThreadPool(numThreads)
:当您向
执行器服务
提交
可运行的
可调用的
时,您会得到一个
未来的
,如果需要,您可以取消它

如果希望任务提前结束,您仍然需要编写
Runnable
Callable
来检查中断,并使用
future.cancel(true)
取消任务

这意味着您正在“取消任务”,而不是“停止线程”。区别是微妙的<代码>未来
s只是级别更高一点,更易于使用。首先,您可以避免为每个子任务创建新线程的开销,因为相同的线程被重用


但是您仍然需要存储对
未来的
的引用,例如在数组或列表中。

Java语言不识别线程之间的任何父/子关系,但它确实有一些可能帮助您:了解
Java.lang.ThreadGroup


每个线程都是线程组的成员,您可以
interrupt()
ThreadGroup。如果您的所有线程都被设计为在中断时停止,并且它们都是同一线程组的成员,那么您可以通过中断线程组来停止它们。

Java语言无法识别线程之间的任何父/子关系,但是它确实有一些东西可以帮助您:阅读
java.lang.ThreadGroup


每个线程都是线程组的成员,您可以
interrupt()
ThreadGroup。如果所有线程都设计为在中断时停止,并且它们都是同一线程组的成员,然后,您可以通过中断线程组来停止所有线程。

您可以拥有一个
线程组
。您不应该从顶层停止线程,而是通过在父类中设置可读的
标志
。@ScaryWombat-或使用
Thread.interrupt()
线程.isInterrupted()
您可以拥有一个
线程组
。您不应该从顶层停止线程,而是通过在父类中设置一个可读的
标志
让线程知道它们应该自杀。@ScaryWombat-或者使用
线程.interrupted()
线程.isInterrupted())
ExecutorService绝对是一种解决问题的方法如果您使用ExecutorService,提交给它的任务应该非常短,或者响应中断以结束任务prematurely@bowmore与“原始线程”任务完全相同,如果您想让它们过早结束,任务需要非常短或对中断做出响应。是的,确实如此。我觉得你的回答没有很清楚地突出这一点。“一个更干净的替代方案”这句话似乎是ExecutorService与interruption的对比。@bowmore在
ExecutorService
中添加了一点关于interruption的内容。如果您使用ExecutorService,提交给it的任务应该非常短,或者对中断做出响应,以结束任务prematurely@bowmore与“原始线程”任务完全相同,如果您想让它们过早结束,任务需要非常短或对中断做出响应。是的,确实如此。我觉得你的回答没有很清楚地突出这一点。“一个更干净的替代方案”的措辞似乎是服务与中断的对比。@bowmore在