我对java中的多线程编程有所了解
我知道任何新创建的线程都默认附加到当前的ThreadGroup。如果你创建一个新的ThreadGroup,它作为子连接到当前的ThreadGroup。
我写了一个模块化的程序如下:
想象我们有类似下面的内容来启动每个模块:
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()方法中新创建的线程数。
所以我的问题是:
答案 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