Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理线程任务(如文件下载)中的错误_Java_Multithreading_Exception Handling_Error Handling - Fatal编程技术网

Java 处理线程任务(如文件下载)中的错误

Java 处理线程任务(如文件下载)中的错误,java,multithreading,exception-handling,error-handling,Java,Multithreading,Exception Handling,Error Handling,假设我有一个应用程序,它使用线程通过HTTP或FTP下载文件。我可以想象在后台会出现一些错误,需要进行一些错误处理: 远程主机不可用 下载速度太慢了 某些数据已损坏(如果检查到位) 没有发送任何数据 内容与预期的文件类型不对应 报告的大小和数据不一致 如何处理这些错误以将错误传递回主应用程序?或者如果无法恢复,则中止?这是一个非常普遍的问题,有许多可能的解决方案。这在很大程度上取决于线程当前向主应用程序报告的信息。例如,如果它在字符串中返回一些远程文件内容,则null可能表示数据存在某种问

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

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

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

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

在传回信息方面。如果不使用可调用的
和,则
Runnable
类可能具有某种
getStatus()
方法。您还可以将
WorkRequest
类传递到
Thread
中,该类为手头的作业填写,其中可能包含有关遇到的任何错误的信息


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

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

在传回信息方面。如果不使用可调用的
和,则
Runnable
类可能具有某种
getStatus()
方法。您还可以将
WorkRequest
类传递到
Thread
中,该类为手头的作业填写,其中可能包含有关遇到的任何错误的信息


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

看看java.util.concurrent执行器和执行器服务。执行者是一个线程池,您可以向其提交任务并获得未来。有很多方法可以使用执行器,它们非常强大

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


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

看看java.util.concurrent Executors和Executor服务。执行者是一个线程池,您可以向其提交任务并获得未来。有很多方法可以使用执行器,它们非常强大

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


由于Callables会引发异常,所以当您从Executor获得未来时,您可以在主类中处理它们。

如果需要上下文,请考虑获取RSS提要或FTP客户端的应用程序。我对两者都感兴趣。
JobStatus
听起来是个好主意。关于
getStatus()
,想法是时不时地轮询任务?我一直在考虑一种回调模式,但可能有缺点。至于使用
Future
,我不太明白这个类代表什么,但是,除非弄错了,它很可能用在我更熟悉的
SwingWorker
中。
Future
用在优秀的
ExecutorService
类中。请看这里:谢谢。我只是碰巧看到了同一个站点:p
ExecutorService
threadpool在有许多小任务要做时工作得最好。您可以将RSS URL提交到要处理的线程池。对于每个RSS提要,您都可以提交一个
可调用的
,它会传回您的
作业状态
信息。如果需要上下文,请考虑一个获取RSS提要的应用程序或FTP客户端。我对两者都感兴趣。
JobStatus
听起来是个好主意。关于
getStatus()
,想法是时不时地轮询任务?