我目前有代码执行以下操作:
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?
答案 0 :(得分:2)
您正在使用API,但请记住,每个任务都在一个单独的线程中运行,而不是一个单独的进程(因此不必并行)。
每个线程必须在单独的CPU核心上运行才能实际同时执行。是否可行取决于您的计算机,当前负载以及JVM和OS如何跨核心调度线程。