Вы уверены, что отправленные вами задания действительно завершены?Если вы проверите API для shutdownNow () и shutdown () , вы увидите, что они не гарантируют завершение.
Вы пытались использовать вызов awaitTermination (long timeout, TimeUnit unit) с разумным количеством времени в качестве параметра тайм-аута?(редактировать: «разумное количество времени» зависит, конечно, от среднего времени обработки ваших задач, а также от количества задач, выполняемых в момент, когда вы вызываете завершение)
Edit2: Я надеюсь, что следующий пример из моего собственного кода может помочь вам (обратите внимание, что это, вероятно, не оптимальный или самый любезный способ решения этой проблемы)
try {
this.started = true;
pool.execute(new QueryingAction(pcqs));
for(;;){
MyObj p = bq.poll(timeout, TimeUnit.MINUTES); // poll from a blocking queue
if(p != null){
if (p.getId().equals("0"))
break;
pool.submit(new AnalysisAction(ds, p, analyzedObjs));
}else
drc.log("Timed out while waiting...");
}
} catch (Exception ex) {
ex.printStackTrace();
}finally{
drc.log("--DEBUG: Termination criteria found, shutdown initiated..");
pool.shutdown();
int mins = 2;
int nCores = poolSize -1 ;
long totalTasks = pool.getTaskCount(),
compTasks = pool.getCompletedTaskCount(),
tasksRemaining = totalTasks - compTasks,
timeout = mins * tasksRemaining / nCores;
drc.log( "--DEBUG: Shutdown commenced, thread pool will terminate once all objects are processed, " +
"or will timeout in : " + timeout + " minutes... \n" + compTasks + " of " + (totalTasks -1) +
" objects have been analyzed so far, " + "mean process time is: " +
drc.getMeanProcTimeAsString() + " milliseconds.");
pool.awaitTermination(timeout, TimeUnit.MINUTES);
}