有人可以帮助解释此错误:
private static ExecutorService es = Executors.newFixedThreadPool(1);;
private static List<Future<?>> futures = new ArrayList<Future<?>>();
futures.add(es.submit(new Callable<Object>() {
public Object call() throws Exception {
try{
Polling.start(); //has an while(true) loop
} catch (Exception e){
e.printStackTrace();
}
return null;
}
}));
Thread.sleep(2000);
System.out.println("stopping...");
es.shutdownNow();
futures.clear();
这给出了:
java.lang.InterruptedException: sleep interrupted
如何通过处理main方法中的延迟来避免上述异常?
堆栈跟踪
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at bus.Polling.start(Polling.java:107)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
答案 0 :(得分:4)
InterruptedException
是Java机制,用于让Executor告诉其Callables停止他们正在做的事情,清理并退出。
如果您不想看到它,请抓住它并正确结束您的Callable。
答案 1 :(得分:2)
你正在做你想要达到的目标。由于您的轮询类具有无限循环,因此中断是一种合适的方法来阻止它。至于异常:在Polling-Class中捕获它并在它发生时退出for循环。
答案 2 :(得分:0)
您正在设置一个可调用的,它在无限循环中保持睡眠,然后通过关闭整个执行程序服务强制终止该可调用。如果您的可调用程序正常终止,或者您没有强行关闭它,则不会出现此异常。
您使用此代码实际尝试实现的目标是什么?
答案 3 :(得分:0)
执行callable的线程正在被中断,因为main
线程完成并退出。有几种方法可以解决这个问题。一种方法是将执行线程声明为守护进程:
ExecutorService pool = Executors.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = Executors.defaultThreadFactory().newThread(runnable);
thread.setDaemon(true);
return thread;
}
});
但这实际上取决于你想要达到的目标。
答案 4 :(得分:0)
优先使用es.shutdown()优先于es.shutDownNow()会使InterruptedException消失。但是,除非上下文更清楚,否则很难回答这个问题。
回应你的兴趣:
1)将任务提交给执行者服务并获得相应的未来。
2)每当收到适当的事件以取消任务时使用此未来。调用future.cancel(true)。
3)在将来的任务中,观察线程是否被中断,在这种情况下你是否从循环中断开并让任务完成。