java - 创建更多线程的线程

标签 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 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 提交一个 RunnableCallable 时,您会得到一个Future,您可以根据需要取消。

如果你想让任务提前结束,你仍然需要写RunnableCallable来检查中断,并用future.cancel(真)

这意味着您正在“取消任务”,而不是“停止线程”。区别很微妙。 Future 的级别更高,使用起来也更好。一方面,您避免了为每个子任务创建新线程的开销,因为可以重复使用同一个线程。

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

关于java - 创建更多线程的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37562174/

相关文章:

c# - 多个生产者/单个消费者,处理异步无锁?

Java Swing多线程访问JTextArea

python - 为什么 scikit-learn 中的 GridSearchCV 产生这么多线程

java - 为什么我会收到并发修改错误?

java - 修改列表不应影响其对象 - Java

java - java小程序中的.class错误

java - 如何在 SharedPreferences 中保存和检索日期

java - 管理 Junit 测试的测试数据

java - 内容解析器在 public void onActivityResult 的 fragment 内部变成红色

.net - OpenCV多线程调用