Следующий фрагмент кода пытается совместить это.
Кодирует цикл навсегда и проверяет, есть ли какие-либо ожидающие обработки запросы. Если он есть, он создает новый поток для обработки запроса и отправляет его исполнителю. Как только все потоки выполнены, он спит в течение 60 секунд и снова проверяет ожидающие запросы.
public static void main(String a[]){
//variables init code omitted
ExecutorService service = Executors.newFixedThreadPool(15);
ExecutorCompletionService<Long> comp = new ExecutorCompletionService<Long>(service);
while(true){
List<AppRequest> pending = service.findPendingRequests();
int noPending = pending.size();
if (noPending > 0) {
for (AppRequest req : pending) {
Callable<Long> worker = new RequestThread(something, req);
comp.submit(worker);
}
}
for (int i = 0; i < noPending; i++) {
try {
Future<Long> f = comp.take();
long name;
try {
name = f.get();
LOGGER.debug(name + " got completed");
} catch (ExecutionException e) {
LOGGER.error(e.toString());
}
} catch (InterruptedException e) {
LOGGER.error(e.toString());
}
}
TimeUnit.SECONDS.sleep(60);
}
}
Мой вопрос - большая часть обработки этих потоков связана с базой данных. И эта программа будет работать на машине Windows. Что происходит с этими потоками, когда кто-то пытается отключить или выйти из машины? Как изящно завершить работающие потоки, а также исполнитель.