Лучший способ параллельного цикла - PullRequest
3 голосов
/ 09 октября 2019

Если я хочу распараллелить этот код:

try {
    for (int i = 0; i < 10000; i++) {
        new File(String.valueOf(i)).createNewFile();
    }
} catch (IOException e) {
    e.printStackTrace();
}

, тогда я переписываю его следующим образом:

ArrayList<String> fileNames = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
    fileNames.add(String.valueOf(i));
}
fileNames.parallelStream().forEach(i -> new File(i).createNewFile());

Но нет ли лучшего (более простого) способа для этого?

Ответы [ 3 ]

3 голосов
/ 09 октября 2019

Отдельный отказ от ответа:

Если я хочу распараллелить этот код:

Тогда вам (скорее всего) потребуется обратиться к совершенно другому оборудованию/ стек программного обеспечения, чтобы получить что-то от этого.

Видите ли, если мы не говорим о какой-то "удаленной" файловой системе, которая может быть (и на самом деле равна ) достигнута через несколько«пути», и это фактически напоминает несколько устройств ввода-вывода ... ваша попытка оптимизации бессмысленна .

Имеет смысл только распараллелить действия, которые включают в себя большое количество ожидания для разных вещей. Но в вашем случае ваш код взаимодействует с одной операционной системой, используя одну файловую систему. Скорее всего, ваша идея даже замедляет ход вещей.

1 голос
/ 09 октября 2019

Попробуйте IntStream in parallel():

IntStream.range(0, 10000).parallel().forEach(i -> {
    try {
        new File(String.valueOf(i)).createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
});

Но из-за операций с диском это будет не очень эффективно.

0 голосов
/ 09 октября 2019

просто чтобы иметь другую возможность ..

fileNames.parallelStream().map(Path::Files.createFile).collect(Collectors.toList());
fileNames.stream().map(path -> Files.createFile(path)).collect(...

между возвращает список с объектами Path внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...