1

假设我有一个使用线程通过 HTTP 或 FTP 下载文件的应用程序。我可以想象在后台出现了一些需要一些错误处理的问题:

  • 远程主机变得不可用。
  • 下载速度太慢了。
  • 某些数据已损坏(如果检查到位)。
  • 没有数据正在发送。
  • 内容与预期的文件类型不符。
  • 报告的大小和数据不对应。
  • ...

如何以将错误传递回主应用程序的方式处理这些问题?或者如果无法恢复则中止?

4

2 回答 2

6

这是一个非常普遍的问题,有许多可能的解决方案。这在很大程度上取决于线程当前正在向主应用程序报告什么信息。例如,如果它在 a 中返回一些远程文件内容,Stringnull可能表明数据存在某种问题。如果您想要更具体的信息,那么您可能需要创建某种JobStatus类来封装您提到的一些错误条件。也许该类还包括远程文件内容或实际工作负载。

在传回信息方面。如果您不使用 a和thread-poolsRunnable该类可能有某种方法。您还可以将一个类传递给您,它为手头的工作填写,其中可能包括有关遇到的任何错误的信息。getStatus()Callable<...>ExecutorServiceWorkRequestThread

通常,我倾向于依靠日志记录来显示问题的实际来源和详细信息,并依靠引发的异常Future.get()来转发我的处理线程存在某种问题。但同样,如果没有更多上下文,很难确定在您的环境中什么是有意义的。

于 2012-09-12T13:22:19.963 回答
2

看看 java.util.concurrent 具体是 Executors 和 Executor 服务。Executor 是一个线程池,您可以向其提交任务并获得 Futures。Executors 的使用方法有很多种,而且它们非常强大。

了解线程是如何工作的很好,但在实践中,我发现自己真正创建线程的情况极为罕见。让线程池处理这个问题,它们使用所有正确的阻塞队列,如果线程意外死亡,池将创建一个新线程来替换它。您所要做的就是传递一个 Runnable、Callable 或其中任何一个的列表并处理 Futures。

由于 Callables 抛出异常,当您从 Executor 获取 Future 时,您可以在主类中处理它们。

于 2012-09-12T13:49:07.600 回答