Java Sleep-interrupted异常

时间:2011-09-07 05:32:51

标签: java multithreading

有人可以帮助解释此错误:

    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)

5 个答案:

答案 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)在将来的任务中,观察线程是否被中断,在这种情况下你是否从循环中断开并让任务完成。