以下代碼片段試圖完成此操作。線程和執行程序的優雅關閉
該代碼將永久循環並檢查是否有任何待處理的請求需要處理。如果有的話,它會創建一個新線程來處理請求並將其提交給執行者。一旦所有線程完成,它會休眠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機器上。當有人試圖關閉或註銷機器時,這些線程會發生什麼?如何正常關閉正在運行的線程以及執行程序。
這是倒退。假設'ExecutorService'是由'Executors'工廠方法返回的典型值之一,背襯線程非守護線程。在這些線程退出之前,關閉鉤子將不會被調用,並且直到「ExecutorService」關閉纔會發生。只有在執行程序的線程不是守護進程或者程序收到用戶中斷的情況下,您的解決方案纔會生效。 – 2015-10-07 01:11:17
的OP大約是在JVM已經被要求執行有序關機的情況下專門詢問。無論如何,答案的內容都是準確的,只需要在關閉鉤子中不要這樣做就可以提前終止執行程序服務。 – 2015-10-07 01:22:21
非常感謝您的回答。我想我錯過了他們問題的那一部分。你可以添加第三個***來澄清這一點嗎? – 2015-10-07 01:24:28