Java 从ScheduledExecutorService提取异常
我有一个预定的执行器,其功能连接到internet,并且有可能引发异常和异常。此执行器是我正在开发的SDK的一部分,必须将异常抛出到实现应用程序 我目前正在做以下工作Java 从ScheduledExecutorService提取异常,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有一个预定的执行器,其功能连接到internet,并且有可能引发异常和异常。此执行器是我正在开发的SDK的一部分,必须将异常抛出到实现应用程序 我目前正在做以下工作 Runnable task = new Runnable() { @Override public void run(){ WindowCallback(); } }; _windowTimer.scheduleAtFixedRate(task, 0, this.SQSW
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函数不兼容
我如何使用一个可以在循环计时器中抛出异常的可调用对象?一旦任务抛出异常,它就结束了:它不会被重新调度。即使不是这样,异常也会在
ScheduledExecutorService
的内部丢失。您的应用程序永远不会发现它,因为它发生在一个单独的线程上
因此,您必须设计一种捕获任务中的所有内容并通过某种机制将异常发送到应用程序的设计,比如调用专用的
异常回调
,实际上添加一个抽象方法来处理在catch块中调用的异常是处理此问题的一种很好的方法。它允许开发人员使用自己的实现根据需要处理异常。您的意思是将该方法添加到Runnable
?但这并没有给你什么好处:仅仅编写public void run(){try{…code…}catch(Throwable t{…handle…}}
是一样的。所以抽象方法只需一次try-catch就可以了。不,我的意思是在catch块中调用抽象方法并将异常传递给该方法。抽象方法的重要部分是通知开发人员发生了异常,并传递信息,以便他们可以根据自己的需要进行处理。以前的实现吸收了异常,但由于服务中捕获了异常,开发人员从未收到通知。我想知道的是抽象方法是在哪里声明的。它是在服务类中声明的,服务类中还有其他几个抽象方法。因此隐式抛出异常抛出新的MyException(“你好,伙计”)