FutureTasks和CachedThreadPool如何工作

时间:2010-03-05 16:15:28

标签: java concurrency futuretask executors

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

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分钟(与first_task的20s相比)。

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

1 个答案:

答案 0 :(得分:2)

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

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