2017-02-09 29 views
0

私はJava 7でプログラムを構築しています。ダウンロードしたファイルの値によっては、バックエンドサーバーから複数のファイルをダウンロードする必要があります。Javaの非同期タスク内でビジー待機を実装する

私は説明します:

を第一に、私のプログラムがこのファイルをダウンロードするファイルの値が含まれているAsyncTaskを経由してファイルをダウンロードします。 onPostメソッドは、これらのファイルをダウンロードし、アプリデータに操作した後に配列リストに挿入する別のメソッドを呼び出します。

ここで、これらのAsyncTaskの終了を処理するために、ダウンロードするファイルの数を知っていることを考慮して、別のAsyncTaskを作成してビジー待機を作成しました。 whileループのファイル番号と同じです。

私の質問は、AsyncTaskで待っていると、OSが実行中のプロセッサをリリースする機能を無効にするか、それとも何も心配しないことですか?

私は、ファイルをより速くダウンロードするためにプロセッサをロックすることを待っていませんか、それとも問題ありませんか?

私は非同期タスクに独自のapocがあり、必要に応じてスリープ状態に入ると仮定しているため、このビジー状態の待機によってプロセッサの乱用はないと仮定します。

ダウンロードする必要があるファイルの量は処理時間に影響しますか?そして、はいの場合、データを含む1つのファイルをダウンロードする方が、ダウンロードを複数の小さなファイルにマルチスレッドするよりも優れていますか?

最後に、自分自身のビジー待機をAsyncTaskに書き込むことをお勧めしますか?

私はすぐにいくつかのコードスニペットを追加します...

+0

1.ビジー待機をしないでください。 2.別の解決策を見つける... :)あなたのコードは、すべてのダウンロードが完了したときを知っています - リストに最後に追加されたものは、そのリストがいっぱいであり、そこでイベントが発生することがあります。 – ZhongYu

答えて

0

は、私自身のXYZを書くための良い方法です - いや、ほとんどない、独自の対その自由がない限り、これは新しい言語のためではありませんか、プラットフォームでは、大学の研究を行っているか、標準的な実装はあなたが現実的なチャンスを乗り越えるために非常にうそです。この場合、上記のどれも当てはまりません。

java.util.concurrentパッケージの標準部品を使用することをお勧めします。これには、必要な待機機能を実装するFutureクラスなど、プロジェクトに非常に役立つ多くのクラスがあります。先物は、複数の方法でそこに実装されているエグゼキュータサービスによって返されることがあります。

さらに処理を制御する必要がある場合は、CyclicBarrierを使用することもできます。あるスレッドが別のスレッドを完了するまで待つことができます。ダウンロードがストールしたと思われる場合は、タイムアウトを使用できます。

標準的なランタイムの一部として無料で提供されている複製用の機能のために自国のフレームワークを実装することは、明確で直接的な答えではありません。忙しい待ちの有無にかかわらず、それほど重要ではありません。

+0

私はこの質問を投稿する前にFutureクラスについて読んできました。それは役に立つと思われますので、私は直ちにそれを手に入れましょう.execute()を実行するのではなく、executorサービスにタスクを追加しますか? – user2438341

+0

はい、Callableを提出すれば、あなたはFutureを手に入れます。 – h22

関連する問題