2011-09-07 84 views
2

有人能帮忙解释一下这个错误:Java的睡眠所中断异常

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 

如何避免上面的异常,通过处理主要方法延误?

堆栈跟踪

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) 
+2

显示你的stacktrace – confucius

回答

0

你正在建立一个可调用其保持在一个无限循环睡觉,后来强行终止通过调用关闭整个执行服务。如果您的通话时间正常终止,或者您没有强行关闭,则不会得到此例外。

你真的想用这段代码实现什么?

+0

我想有一种方法来启动/停止一个子java程序。子程序做了一些事件轮询,所以当我打电话.start()开始轮询。但在父程序中,我想有一种方法来启动()程序,但也关闭它。关闭它只是通过杀死线程。我编辑了这个问题来反映这一点。 – Larry

0

由于main线程完成并退出,正在执行您的可调用线程的线程正在中断。有几种方法可以解决这个问题。一种方法是将执行线程声明为守护进程:

ExecutorService pool = Executors.newSingleThreadExecutor(new ThreadFactory() { 
    @Override 
    public Thread newThread(Runnable runnable) { 
     Thread thread = Executors.defaultThreadFactory().newThread(runnable); 
     thread.setDaemon(true); 
     return thread; 
    } 
}); 

但它确实取决于您想实现的目标。

+0

谢谢,关于我想实现的内容:请参阅Peter的评论 – Larry

0

优先使用es.shutdown()而不是es.shutDownNow()会使InterruptedException消失。但是,除非上下文更清楚,否则很难回答这个问题。

回应您exaplaining背景:

1)提交任务的执行者服务,并获得相应的未来。

2)每当收到适当的事件取消任务时使用这个未来。调用future.cancel(true)。

3)在将来的任务中,观察线程是否被中断,在这种情况下,你从循环中跳出并让任务完成。

4

InterruptedException是Java机制,用于让Executor告诉它的Callables停止他们正在做的事情,清理并退出。

如果你不想看到它,然后抓住它并正确结束你的Callable。

2

你只是在做你想达到的目标。由于您的轮询类具有无限循环,因此中断是一种合适的方式来阻止它。至于例外:在轮询类中捕获它并在发生时退出for-loop。