Я создаю несколько потоков, к которым у меня есть доступ параллельно (или, возможно, параллельно). Я знаю, как сделать попытку с ресурсами, когда количество ресурсов фиксировано во время компиляции, но что, если количество ресурсов определяется параметром?
У меня есть что-то вроде этого:
private static void foo(String path, String... files) throws IOException {
@SuppressWarnings("unchecked")
Stream<String>[] streams = new Stream[files.length];
try {
for (int i = 0; i < files.length; i++) {
final String file = files[i];
streams[i] = Files.lines(Paths.get(path, file))
.onClose(() -> System.out.println("Closed " + file));
}
// do something with streams
Stream.of(streams)
.parallel()
.flatMap(x -> x)
.distinct()
.sorted()
.limit(10)
.forEach(System.out::println);
}
finally {
for (Stream<String> s : streams) {
if (s != null) {
s.close();
}
}
}
}
close()
теоретически (хотя на практике маловероятно) может выдатьUncheckedIOException
, поэтому вам, вероятно, следует заключитьs.close()
вtry { s.close(); } catch (Exception ex) { //quash or log }
. - person Andrew Janke   schedule 07.05.2015sorted()
/distinct()
иforEach
(а неforEachOrdered
) - рецепт проблем. См. stackoverflow.com/q/28259636/2711488. - person Holger   schedule 07.05.2015