0

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

据我所知,默认情况下,任何新创建的线程都附加到当前的 ThreadGroup 上。如果您创建一个新的 ThreadGroup,它会作为子项附加到当前 ThreadGroup。

我编写了一个模块化程序,如下所示:

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

想象一下我们有类似下面的东西来启动每个模块:

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

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

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

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

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

对于这种情况,我编写了以下代码:

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 的新创建线程?

对不起,我的英语不好。

4

1 回答 1

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
于 2017-10-24T14:13:54.547 回答