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

FutureTasks和CachedThreadPool如何工作

  •  2
  • Aly  · 技术社区  · 15 年前

    我目前有执行以下操作的代码:

    private final static ExecutorService pool = Executors.newCachedThreadPool();
    public void foo(){
        FutureTask<MyObject> first_task = createFutureTask();
        FutureTask<MyObject> second_task = createFutureTask();
        ...
    
        pool.execute(first_task);
        pool.execute(second_task);
        ....
        first_task.get();
        second_task.get();
        ...
        System.out.println(time taken);
    }
    

    我现在遇到的问题是,我让未来的每一项任务都打印出它们在计算时所花费的时间,例如,在控制台上,我将看到

    first_task : 20000ms
    second_task : 18000ms
    ...
    

    但是总的时间( System.out.println(time taken) )比任何未来任务所用的最长时间要长得多,因此根据这个例子,该方法需要大约1分钟(与第一个任务的20秒相比)。

    我觉得这些未来的任务是并行运行的,但从时间上看,它们似乎是一个接一个地运行。我是否正确使用此API?

    1 回复  |  直到 15 年前
        1
  •  2
  •   wsorenson    15 年前

    您正确地使用了API,但请记住,每个任务运行在一个单独的线程中,而不是一个单独的进程(因此不一定是并行的)。

    每个线程必须在单独的CPU核心上运行,才能同时实际执行。这是否可行取决于您的机器、当前的负载以及JVM和OS如何能够跨核心调度线程。