java - 新创建的线程附加到我的自定义ThreadGroup时的监听器

时间:2017-10-24 13:46:27

标签: java multithreading threadpool threadgroup

我对java中的多线程编程有所了解

我知道任何新创建的线程都默认附加到当前的ThreadGroup。如果你创建一个新的ThreadGroup,它作为子连接到当前的ThreadGroup。

我写了一个模块化的程序如下:

  • 每个模块都扩展了类Module
  • 每个模块都有自己的大小为5的线程池
  • 每个模块都有自己的CustomThreadGroup实例
  • 每个模块都在自己的线程池中启动
  • 通过调用发布到其线程池的runnable中的模块'onCreate()方法执行

想象我们有类似下面的内容来启动每个模块:

for(final Module mod : modules){
    mod.executor.execute(new Runnable() {

        @Override
        public void run() { 
            mod.onCreate();
        }
    });
}

executor是一个带有自定义ThreadFactory的线程池,它通过线程池将模块的CustomThreadGroup实例添加到新创建的Thread中。

现在我可以确保在自己的线程池中启动任何模块,并且在onCreate中调用的任何方法都在同一个线程中执行。 如果module想要运行一个长时间运行的任务,它应该将一个新的runnable发布到它的执行者或运行一个新的Thread。

所以,我可以通过调用模块的CustomThreadGroup.enumerate(n,true)递归获取任何模块的Threads

对于这种情况,我在下面写了代码:

while(true){
    for(Module mod : modules){
        CustomThreadGroup tg = mod.getThreadGroup();
        Thread threads[] = tg.getThreads(); // invoke enumerate internally
        // my tasks for classifying threads
    }
    Thread.sleep(5 * 1000); // sleep for 5 secs
    // then recalculate threads count
}

它可以在一个单独的线程中很好地计算将在模块的onCreate()方法中新创建的线程数。

所以我的问题是:

如何在不执行无限循环的情况下通知附加到ThreadGroup的新创建的线程?

抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

您可以使用CountDownLatch

final CountDownLatch cdl = new CountDownLatch(modules.size());

for (final Module mod : modules) {
    mod.executor.execute(new Runnable() {
        @Override
        public void run() {
            mod.onCreate(cdl);
            // TODO in mod.onCreate
            // cdl.countDown();
        }
    });
}

// Waiting all module
cdl.await();
// All module are started