假设我有一个使用线程通过 HTTP 或 FTP 下载文件的应用程序。我可以想象在后台出现了一些需要一些错误处理的问题:
- 远程主机变得不可用。
- 下载速度太慢了。
- 某些数据已损坏(如果检查到位)。
- 没有数据正在发送。
- 内容与预期的文件类型不符。
- 报告的大小和数据不对应。
- ...
如何以将错误传递回主应用程序的方式处理这些问题?或者如果无法恢复则中止?
假设我有一个使用线程通过 HTTP 或 FTP 下载文件的应用程序。我可以想象在后台出现了一些需要一些错误处理的问题:
如何以将错误传递回主应用程序的方式处理这些问题?或者如果无法恢复则中止?
这是一个非常普遍的问题,有许多可能的解决方案。这在很大程度上取决于线程当前正在向主应用程序报告什么信息。例如,如果它在 a 中返回一些远程文件内容,String
则null
可能表明数据存在某种问题。如果您想要更具体的信息,那么您可能需要创建某种JobStatus
类来封装您提到的一些错误条件。也许该类还包括远程文件内容或实际工作负载。
在传回信息方面。如果您不使用 a和thread-pools,Runnable
该类可能有某种方法。您还可以将一个类传递给您,它为手头的工作填写,其中可能包括有关遇到的任何错误的信息。getStatus()
Callable<...>
ExecutorService
WorkRequest
Thread
通常,我倾向于依靠日志记录来显示问题的实际来源和详细信息,并依靠引发的异常Future.get()
来转发我的处理线程存在某种问题。但同样,如果没有更多上下文,很难确定在您的环境中什么是有意义的。
看看 java.util.concurrent 具体是 Executors 和 Executor 服务。Executor 是一个线程池,您可以向其提交任务并获得 Futures。Executors 的使用方法有很多种,而且它们非常强大。
了解线程是如何工作的很好,但在实践中,我发现自己真正创建线程的情况极为罕见。让线程池处理这个问题,它们使用所有正确的阻塞队列,如果线程意外死亡,池将创建一个新线程来替换它。您所要做的就是传递一个 Runnable、Callable 或其中任何一个的列表并处理 Futures。
由于 Callables 抛出异常,当您从 Executor 获取 Future 时,您可以在主类中处理它们。