我现在有代码,执行以下操作:

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)。

我的印象是,这些未来的任务并行运行,但是从时序却仿佛他们正在运行一个接一个下。 am我正确使用该API?

有帮助吗?

解决方案

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

每个线程将必须在一个单独的CPU核心上运行实际在同一时间执行。这是否可行取决于你的机器,它的电流负载,并在JVM和操作系统如何能够跨越内核调度线程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top