Java: дизайн для использования многих служб исполнителей и только несколько потоков - PullRequest
0 голосов
/ 08 июня 2010

Мне нужно запустить параллельно несколько потоков, чтобы выполнить некоторые тесты.

Мой «механизм тестирования» будет иметь n тестов, каждый из которых будет выполнять k суб-тестов. Каждый результат теста сохраняется для последующего использования.

Итак, у меня есть n * k процессов, которые можно запускать одновременно.

Я пытаюсь понять, как эффективно использовать параллельные инструменты Java.

Прямо сейчас у меня есть служба исполнителя на уровне теста и n служба исполнителя на уровне под-теста.

Я создаю свой список Callables для тестового уровня. Затем каждый вызываемый тест создает новый список вызываемых объектов для уровня подтестов. При вызове тестового вызова впоследствии будут вызываться все вызываемые подтесты

  • тест 1
    • подтест a1
    • подтест ... 1
    • подтест k1
  • test n
    • подтест a2
    • подтест ... 2
    • подтест k2

последовательность вызовов:

  • менеджер тестов создать тест 1 вызываемый
    • test1 вызываемый создать подтест от a1 до k1
    • testn callable создать подтест к кн
  • менеджер тестов вызывает все тестовые вызовы
    • test1 вызываемый вызов всех подтестов от a1 до k1
    • testn callable вызывает все подтесты к кн

Это работает нормально, но у меня есть много новых созданных протекторов.

Я не могу поделиться службой исполнителя, так как мне нужно вызвать 'shutdown' для исполнителей.

Моя идея исправить эту проблему - предоставить одинаковый пул потоков фиксированного размера для каждой службы исполнителя.

Как вы думаете, это хороший дизайн? Я скучаю по чему-то более подходящему / простому для этого?

1 Ответ

4 голосов
/ 09 июня 2010

Использовать одного фиксированного исполнителя пула потоков. Избегайте вызова shutdown, если вы делаете это, у вас, вероятно, есть какая-то ошибка.

Вот некоторый псевдокод, который является моим лучшим предположением о том, что вы хотите, с небольшой опубликованной информацией.

main () {
    ArrayList<Future<?>> futures = new ArrayList<Future<?>>();
    ExecutorService exec = Executors.newFixedThreadPool(Runtime.getNumProcessors())
    futures.add(exec.submit(Test1));
    ...
    futures.add(exec.submit(Testn));

    for (Future<?> future:futures) {
       ? result = future.get();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...