Mam List<List<File>>, która dziele i dla każdej części odpalam n Threads. Każdy Thread buduję TreeMap<String, List<String>>. Chcę później połączyć te wszystkie mapy w jednąTreeMap<String, List<String>> (ale mogą zawierać one ten sam klucz w innym wątku, tzn. jakieś porównania muszą zostać wykonane) albo chciałbym użyć jakiejś threa-safe collection czy concurent, ale nie wiem, której? Klucz może być taki sam dla każdej TreeMap<String, List<String>> ("zwróconej przez Thread"), ale musi być posortowany w głownej TreeMapie, a wartości pojedynczych TreeMaps muszą zostać połączone. Pytanie czy lepiej to połączyć w całość czy uzyć jakiejś thread-safe collection albo concurrent? I jeśli tak to czego?
List<File> filesAndFoldersList = Arrays.asList(filesAndFoldersArray);
List<List<File>> filesArrays = divideArrayIntoChunks(filesAndFoldersList, 100);
for (int i = 0; i < filesArrays.size(); i++) {
List<File> filesList = filesArrays.get(i);
BuildNamesAndFileNamesMap buildNamesAndFileNamesMap = new BuildNamesAndFileNamesMap(... , i);
Thread thread = new Thread(buildNamesAndFileNamesMap, "Thread " + i);
thread.start();
if (buildNamesAndFileNamesMap.hasFinished()) {
namesAndFileNamesPartMap = buildNamesAndFileNamesMap.getNamesAndFileNamesMap();
... // join to main TreeMap or?
}
}
To jest klasa BuildNamesAndFileNamesMap:
private static class BuildNamesAndFileNamesMap implements Runnable {
....
private final TreeMap<String, List<String>> namesAndFileNamesMap;
private int threadNumber;
private boolean hasFinished = false;
public BuildNamesAndFileNameMap(..., int threadNumber) {
...// tworzona jest nowa kolekcja namesAndFileNamesMap
}
public TreeMap<String, List<String>> getNamesAndFileNamesMap() {
return namesAndFileNamesMap;
}
public boolean hasFinished() {
return hasFinished;
}
@Override
public void run() {
...// do some stuff
namesAndFileNamesMap.put(...);
hasFinished = true;
}
}