从ScheduledExecutorService中提取异常

时间:2013-07-08 13:12:05

标签: java multithreading concurrency

我有一个预定的执行程序,其功能连接到互联网并有可能抛出和异常。此执行程序是我正在开发的SDK的一部分,必须将异常抛给实现应用程序。

我目前正在做以下事情,

Runnable task = new Runnable() 
{
    @Override
    public void run(){
        WindowCallback();
    }
};

_windowTimer.scheduleAtFixedRate(task,
        0, this.SQSWindow, TimeUnit.MILLISECONDS);

其中WindowCallback()应抛出异常,但当前正在捕获异常以使此代码正常工作。

我想做以下

Callable task = new Callable() 
{
    @Override
    public Object call() throws Exception{
        WindowCallback();
    }
};

_windowTimer.scheduleAtFixedRate(task,
        0, this.SQSWindow, TimeUnit.MILLISECONDS);

但Callable与执行程序的scheduleAtFixedRate函数不兼容。

如何在定期计时器中使用可以抛出异常的Callable?

1 个答案:

答案 0 :(得分:2)

一旦任务抛出异常,它就结束了:它不会被重新安排。即使不是这样,例外也会在ScheduledExecutorService的内脏中消失。您的应用程序永远不会发现它,因为它发生在一个单独的线程上。

因此,您必须努力设计一个能够捕获任务中的所有内容的设计,并通过某种机制将异常调度到应用程序,例如调用专用的ExceptionCallback