处理文件下载等线程任务中的错误

时间:2012-09-12 13:18:46

标签: java multithreading exception-handling error-handling

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

  • 远方的主人变得无法使用。
  • 下载速度太慢。
  • 某些数据已损坏(如果检查到位)。
  • 没有数据正在发送。
  • 内容与预期的文件类型不符。
  • 报告的尺寸和数据不符合。
  • ...

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

2 个答案:

答案 0 :(得分:6)

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

在传递信息方面。如果您不使用RunnableExecutorService thread-pools,则getStatus()类可以使用某种Callable<...>方法。您还可以将WorkRequest课程传递到您填写的Thread课程中,该课程可以包含有关遇到的任何错误的信息。

通常,我倾向于依赖日志来显示问题的实际来源和详细信息,并依赖于Future.get()抛出的异常来回传我的处理线程存在某种问题。但同样,如果没有更多的背景,很难确定在你的环境中有什么意义。

答案 1 :(得分:2)

看一下java.util.concurrent特别是Executors和Executor服务。 Executor是一个线程池,您可以将任务提交给Futures。有许多方法可以使用Executors,它们非常强大。

理解线程是如何工作的很好,但在实践中我发现自己实际创建一个线程非常罕见。让线程池处理这个,他们使用所有正确的阻塞队列,如果线程意外死亡,池将创建一个新的线程来替换它。您只需传递一个Runnable,Callable或其中任何一个的列表并处理Futures。

由于Callables抛出Exception,当你从Executor获得Future时,你可以在主类中处理它们。