代码之家  ›  专栏  ›  技术社区  ›  Guillaume

Java:使用许多执行器服务和只有少数线程的设计

  •  0
  • Guillaume  · 技术社区  · 14 年前

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

    我的“测试引擎”将有n个测试要执行,每个测试都执行k个子测试。每个测试结果都会存储起来以供以后使用。

    所以我有n*k个进程可以并发运行。

    我正在尝试如何高效地使用Java并发工具。

    现在我有一个测试级的执行器服务和一个子测试级的执行器服务。

    我为测试级别创建了可调用的列表。 然后,每个测试可调用将为子测试级别创建另一个可调用列表。 当调用测试可调用文件时,随后将调用所有子测试可调用文件。

    • 试验1
      • 亚测试A1
      • 子测试…1
      • 分测验K1
    • 测试n
      • 亚测试A2
      • 子测试…2
      • 分测验K2

    呼叫顺序:

    • 测试管理器创建测试1可调用
      • 测试1可调用创建子测试A1到K1
      • testn可调用创建子测试an到kn
    • 测试管理器调用所有测试可调用文件
      • test1可调用调用调用所有子测试a1到k1
      • testn可调用调用调用所有子测试an to kn

    这很管用,但我有很多新的踏板。

    我不能共享执行器服务,因为我需要对执行器调用“shutdown”。

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

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

    1 回复  |  直到 14 年前
        1
  •  4
  •   Tim Bender    14 年前

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