我做的應用程序。它搜索具有特殊擴展名的文件。我使用多線程:在每個目錄(小任務)創建一個線程,這使得這樣的工作:有多少線程最好使用? (java)
/**
* Explore given directory.
* @param dir - directory to explore.
* @return snapshot of directory - FilesAndDirs object,
* which encapsulates information about directory.
*/
public final FilesAndDirs exploreDirectory(final File dir) {
final List<File> subDirectories = new ArrayList<File>();
final List<File> files = new ArrayList<File>();
if (dir.isDirectory()) {
final File[] children = dir.listFiles();
if (children != null) {
for (File child : children) {
if (child.isFile() && !child.isHidden()
&& checkExtension(child)) {
files.add(child);
} else {
if (child.isDirectory() && !child.isHidden()) {
subDirectories.add(child);
}
}
}
}
}
return new FilesAndDirs(files, subDirectories);
}
這種方法使定目錄的快照,並returs像FilesAndDirs對象,holdes列表文件和結果列出subDirs。在另一個方法(getFiles())中,我有List文件 - 具有給定擴展名的文件 - 是搜索結果和第二個List目錄 - 它包含探索方法的每個目錄的子目錄。
因此,每個線程探索目錄,給定的擴展名的文件,他放在結果列表中,他放在子目錄列表中的給定目錄的子目錄,然後將它添加到getFiles()方法的目錄列表中。我使用固定線程池,但問題是我應該使用多少個線程來獲得更好的性能? 我讀過,如果任務不是IO密集型的,我應該使數量等於可用核心數量 Runtime.getRuntime()。availableProcessors()。 現在探索C:和D:目錄的時間是41秒。但也許我應該使用更多的線程或使用一些「魔術」類import java.util.concurrent。 這裏是getFiles()方法:getFiles() method
但您的任務大量使用I/O。所以你可以增加線程數量到可用處理器/內核的數量,但是我甚至不確定這是高性能的,因爲你花在CPU上的時間很少,而在I/O上花費很多時間。當你增加對I/O的訪問時,你創建一個小的開銷,因爲需要訂購更多的請求(因爲它是在一個帶有SSD的智能手機上,所以沒有頭移動的問題) – 2012-02-14 20:20:36
你需要對它進行基準測試找出不同的設備。即使有很多CPU核心,I/O限制的東西也可能在大多數設備上產生相似的結果。 – David 2012-02-14 20:26:05