0

我试图同时读取文件并返回行数

ExecutorService executor = Executors.newFixedThreadPool(2);
FutureTask<Integer> futureOne = new FutureTask<Integer>(new Calcul1());
FutureTask<Integer> futureTwo = new FutureTask<Integer>(new Calcul2());
executor.execute(futureOne);
executor.execute(futureTwo);
while (!(futureOne.isDone() && futureTwo.isDone())) {

}

System.out.println(futureOne.get() + futureTwo.get());
executor.shutdown();

这工作得很好,但我发现如果我读取文件 1 和文件 2 之后会更快......所以我没有得到 futureTash 的任何性能提升

为什么?

4

2 回答 2

5

自旋循环完全浪费了一个核心——这就是线程间信号的用途。如果您只有一个带有两个文件的磁盘,则根本不会有太多的加速,实际上它很可能是负面的。如果您在不同的磁盘上有文件(尤其是具有高延迟连接的网络磁盘),则会有很大的性能提升。

于 2012-06-14T18:42:33.993 回答
2

我怀疑您的应用程序完全受 IO 限制。当您在一个线程中读取单个文件时,您会看到更好的性能,因为您是按顺序访问文件。当您启动两个线程时,您正在读取两个不同的文件,这实际上导致磁盘在两个文件之间来回寻找。如果我们谈论的是旋转盘片类型的磁盘,那么寻道时间是 IO 的重要组成部分。

于 2012-06-14T18:42:54.563 回答