Java объединяет асинхронные и отдельные потоки, медленная производительностьJAVA

Программисты JAVA общаются здесь
Anonymous
Java объединяет асинхронные и отдельные потоки, медленная производительность

Сообщение Anonymous »

У меня есть следующая функция, которая возвращает список, который будет содержать имена аудиофайлов, как только они будут загружены: < /p>

Код: Выделить всё

List getAudios(List text)
Внутри его я использую метод разговора класса службы в простом для lop:

Код: Выделить всё

for (String s: text) {
futures.add(this.talkService.talk(s));
}
Метод разговора отправляет запрос на API Azure и делает две вещи:

[*] Получает SpeechSynthesEresult аудиодатики как Br/ol>
. Получение звука возвращает только Future , а не overseablefuture :

Код: Выделить всё

Future SpeakSsmlAsync(final String var1)
Поэтому мне нужно вызвать метод блокировки .get () , чтобы получить аудио. Чтобы компенсировать эту проблему, я раскручиваю новую параллельную нить, чтобы сделать это: < /p>

Код: Выделить всё

CompletableFuture talk(String text) {
CompletableFuture completableFuture = new CompletableFuture();
SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(config, null);

...
taskExecutor.execute(() -> {
...
Future result = speechSynthesizer.SpeakSsmlAsync(ssmlText);
SpeechSynthesisResult audioResult = result.get();

if (audioResult.getReason() == ResultReason.SynthesizingAudioCompleted) {
byte[] data = audioResult.getAudioData();
String filename = this.fileService.writeToFile(data, "mp3");
completableFuture.complete(filename);
}
});

return completableFuture;
}
Метод writetofile -это метод синхронизации, который использует файл fileOutputStream для записи данных Byte [] в файл.
мой контроллер вызывает действие , который объединяет все аудио файлы:
public void action(List text) {
List audios = getAudios(text);

// wait for all audios to download and then get the list of names
List filenames = CompletableFuture.allOf(audios.toArray(new CompletableFuture[0]))
.thenApply((v) -> {
return audios.stream().map(CompletableFuture::join)
.collect(Collectors.toList());
}).join();
}
< /code>
Однако, когда я смотрю вывод журнала в консоли, кажется, что все аудиофайлы всегда загружаются в правильном порядке почти так, как если бы не одновременно. код, и как это может быть улучшено с точки зрения производительности?


Подробнее здесь: https://stackoverflow.com/questions/794 ... erformance

Вернуться в «JAVA»