java - слушатель, когда новый созданный поток присоединен к моей пользовательской группе ThreadGroup

Я немного разбираюсь в многопоточном программировании в Java.

насколько я знаю, любой вновь созданный поток по умолчанию присоединяется к текущей группе потоков. и если вы создаете новую группу ThreadGroup, она прикрепляется как дочерняя к текущей группе ThreadGroup.

Я написал модульную программу, как показано ниже:

  • каждый модуль расширяет модуль класса
  • каждый модуль имеет свой собственный пул потоков размером 5
  • каждый модуль имеет свой собственный экземпляр CustomThreadGroup
  • каждый модуль запускается в своем собственном пуле потоков
  • выполняется путем вызова метода onCreate() модулей в runnable, отправленном в его пул потоков

представьте, что у нас есть что-то вроде ниже, чтобы запустить каждый модуль:

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

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

executor — это пул потоков с настраиваемым ThreadFactory, который добавляет экземпляр модуля CustomThreadGroup во вновь созданный пул потоков Thread by thread.

теперь я могу убедиться, что любой модуль запускается в своем собственном пуле потоков, и любой метод, вызываемый в onCreate, выполняется в том же потоке. если модуль хочет запустить длительную задачу, он должен отправить новый исполняемый файл своему исполнителю или запустить новый поток.

поэтому я могу рекурсивно получить потоки любого модуля, вызвав модуль 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, без выполнения бесконечного цикла?

Извините за мой плохой английский.


person user3840019    schedule 24.10.2017    source источник


Ответы (1)


Вы можете использовать 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
person alexflex25    schedule 24.10.2017
comment
нет, похоже, я не мог прояснить тему. Я хочу подсчитать потоки, добавленные в группу потоков, а не модули. - person user3840019; 24.10.2017