我对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 的新创建线程?
对不起,我的英语不好。