У меня многопоточное выполнение, и я хочу отслеживать и распечатывать время выполнения, но когда я выполняю код, дочерние потоки занимают больше времени, чем основное выполнение, поэтому вывод не является видимый и не печатает правильное значение, так как оно заканчивается раньше.Главный класс Java заканчивается до выполнения нитей
Вот код:
public static void main(String[] args) throws CorruptIndexException, IOException, LangDetectException, InterruptedException {
/* Initialization */
long startingTime = System.currentTimeMillis();
Indexer main = new Indexer(); // this class extends Thread
File file = new File(SITES_PATH);
main.addFiles(file);
/* Multithreading through ExecutorService */
ExecutorService es = Executors.newFixedThreadPool(4);
for (File f : main.queue) {
Indexer ind = new Indexer(main.writer, main.identificatore, f);
ind.join();
es.submit(ind);
}
es.shutdown();
/* log creation - code I want to execute when all the threads execution ended */
long executionTime = System.currentTimeMillis()-startingTime;
long minutes = TimeUnit.MILLISECONDS.toMinutes(executionTime);
long seconds = TimeUnit.MILLISECONDS.toSeconds(executionTime)%60;
String fileSize = sizeConversion(FileUtils.sizeOf(file));
Object[] array = {fileSize,minutes,seconds};
logger.info("{} indexed in {} minutes and {} seconds.",array);
}
Я попробовал несколько решений, таких как присоединиться(), ждать() и notifyAll(), но ни один из них не работал.
Я нашел этот Q&A на StackOverflow, который рассматривает мою проблему, но присоединиться() игнорируется, и если я ставлю
es.awaitTermination (тайм-аут, TimeUnit.SECONDS);
Фактически служба-исполнитель никогда не выполняет потоки.
Какой может быть решение для выполнения многопоточности только в блоке ExecutorService и завершение основного исполнения в конце?
Я бы просто отправил 'Runnable' в' ExecutorService' и не называет 'join()' или что-то еще. То, как вы используете структуру параллелизма, выглядит некорректно.Также следите за тем, что порожденная нить является пользовательским потоком: потоки демона не остановят JVM от выхода. Я уверен, что потоки по умолчанию - это потоки пользователей. –