我有一个多线程执行,我想跟踪并打印出执行时间,但是当我执行代码时,子线程比主执行花费更长的时间,因此输出不可见,也不会打印正确的值,因为它是提前终止。
这是代码:
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);
}
我尝试了几种解决方案,例如 join()、wait() 和 notifyAll(),但都没有奏效。
我在 stackoverflow 上找到了这个Q&A来解决我的问题,但是 join() 被忽略了,如果我把
es.awaitTermination(超时,TimeUnit.SECONDS);
实际上执行器服务从不执行线程。
哪个可以是仅在 ExecutorService 块中执行多线程并在最后完成主要执行的解决方案?