以下代码片段试图完成此操作。线程和执行程序的优雅关闭
该代码将永久循环并检查是否有任何待处理的请求需要处理。如果有的话,它会创建一个新线程来处理请求并将其提交给执行者。一旦所有线程完成,它会休眠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