假设我有一个使用线程通过HTTP或FTP下载文件的应用程序。我可以想象在背景中出现的一些问题需要一些错误处理:
如何以将错误传回主应用程序的方式处理这些问题?或者如果不可恢复则中止?
答案 0 :(得分:6)
这是一个非常普遍的问题,有许多可能的解决方案。它在很大程度上取决于线程当前向主应用程序报告的信息。例如,如果它在String
中返回一些远程文件内容,则null
可能表示数据存在某种问题。如果您需要更具体的信息,那么您可能需要创建某种JobStatus
类来封装您提到的一些错误条件。也许该类还包括远程文件内容或实际工作负载。
在传递信息方面。如果您不使用Runnable
和ExecutorService
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时,你可以在主类中处理它们。