1

スレッドを使用して HTTP または FTP 経由でファイルをダウンロードするアプリケーションがあるとします。バックグラウンドでエラー処理が必要になるいくつかの問題が発生していると想像できます。

  • 遠隔ホストが利用できなくなります。
  • ダウンロード速度が遅すぎます。
  • 一部のデータが破損しています (チェックが適切に行われている場合)。
  • データは送信されていません。
  • コンテンツが予想されるファイルの種類に対応していません。
  • 報告されたサイズとデータは一致しません。
  • ...

エラーをメイン アプリケーションに戻すような方法でこれらを処理するにはどうすればよいでしょうか。または、回復不能な場合は中止しますか?

4

2 に答える 2

6

これはかなり一般的な質問であり、多くの可能な解決策があります。これは、スレッドが現在メイン アプリケーションに報告している情報に大きく依存します。たとえば、リモート ファイルの内容が返された場合Stringnullデータに何らかの問題があることを示している可能性があります。より具体的な情報が必要な場合JobStatusは、言及したエラー条件の一部をカプセル化するある種のクラスを作成する必要があります。このクラスには、リモート ファイルの内容や実際の作業ペイロードも含まれている可能性があります。

情報を返すという点で。aおよびthread-poolsを使用していない場合、クラスは何らかのメソッドをRunnable持つことができます。発生したエラーに関する情報を含む可能性のある、目前のジョブに記入するクラスを に渡すこともできます。getStatus()Callable<...>ExecutorServiceWorkRequestThread

Future.get()通常、ログに依存して実際の原因と問題の詳細を表示し、処理スレッドに何らかの問題があったことを中継するために によってスローされた例外に依存する傾向があります。しかし、繰り返しますが、より多くのコンテキストがなければ、自分の環境で何が理にかなっているのかを判断するのは困難です.

于 2012-09-12T13:22:19.963 に答える
2

java.util.concurrent、具体的には Executors と Executor サービスを見てください。Executor は、タスクを送信して Future を取得するスレッド プールです。Executor を使用するには多くの方法があり、それらは非常に強力です。

スレッドがどのように機能するかを理解するのは良いことですが、実際には、自分で実際にスレッドを作成することはほとんどありません。スレッド プールにこれを処理させます。それらはすべて正しいブロッキング キューを使用し、スレッドが予期せず終了した場合、プールはそれを置き換える新しいスレッドを作成します。処理する必要があるのは、単一の Runnable、Callable、またはこれらのいずれかのリストを渡し、Future を処理することだけです。

Callable は Exception をスローするため、Executor から Future を取得すると、メイン クラスでそれらを処理できます。

于 2012-09-12T13:49:07.600 に答える