Java:设计使用许多执行程序服务,只有少数线程

时间:2010-06-08 11:07:48

标签: java multithreading concurrency

我需要并行运行多个线程来执行一些测试。

我的'测试引擎'将进行n次测试,每次测试都进行k次测试。存储每个测试结果以供以后使用。

所以我有n * k个进程可以同时运行。

我正在尝试有效地使用java并发工具。

现在我在测试级别有一个执行者服务,在子测试级别有一个执行者服务。

我为测试级别创建了Callables列表。 然后,每个可调用的测试将为子测试级别创建另一个可调用的列表。 当调用test callable随后将调用所有subtest callables

  • 测试1
    • subtest a1
    • subtest ... 1
    • subtest k1
  • 测试n
    • subtest a2
    • subtest ... 2
    • subtest k2

通话顺序:

  • 测试管理器创建测试1可调用
    • test1 callable create subtest a1 to k1
    • testn callable create subtest an to kn
  • 测试管理器调用所有测试callables
    • test1 callable调用所有子测试a1到k1
    • testn callable调用所有subtest an到kn

这很好用,但是我创造了很多新的踏板。

我无法共享执行程序服务,因为我需要在执行程序上调用'shutdown'。

我解决此问题的想法是为每个执行程序服务提供相同的固定大小的线程池。

你认为这是一个好的设计吗? 我是否会错过更合适/更简单的事情?

1 个答案:

答案 0 :(得分:4)

使用单个固定线程池执行程序。避免调用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();
    }
}