Android用のダウンロードアプリをやっています。ダウンロード部分が正常に実装され、機能するようになりました。私が必要とするのは、ファイルをセグメントで並行してダウンロードすることです。より明確にするために、ユーザーが 8 つのセグメントを指定した場合、8 つのスレッドを作成してダウンロードを実行したいと考えています。では、どうすれば 8 つのスレッドを動的に作成できるのでしょうか? また、電話でこれを行っているので、メモリ消費を最小限に抑えるにはどうすればよいですか? これまでスレッドで作業したことがないので、これで私を助けてくれることを願っています. お時間をいただきありがとうございます!:)
質問する
164 次
2 に答える
5
一定数のスレッドを作成する最も効率的な方法は、ExecutorServiceを使用することです。
ExecutorService exec = Executors.newFixedThreadPool(8);
これは基本的に、開発者から多くの管理負担がかかる固定サイズのスレッド プールです。
編集:したがって、フローは次のようになります。
まず、スレッド タスク クラスを定義します (各スレッドはcall
独自のタスクのメソッドを実行します)。
class ThreadTask implements Callable<Object> {
public Object call() {
// execute download
...
return result;
}
}
タスクにパラメーターを渡したい場合は、上記のクラスにいくつかのプライベート フィールドを配置し、コンストラクターを介して渡します。また、 から任意の型を返すことができます。その部分call
で型を変更するだけです。implements Callable<...>
スレッドを起動する場合は、プールを作成してタスクを送信します。
ExecutorService exec = Executors.newFixedThreadPool(8);
List<Future<Object>> results = new ArrayList<Future<Object>>();
// submit tasks
for(int i = 0; i < 8; i++) {
results.add(exec.submit(new ThreadTask()));
}
...
// stop the pool from accepting new tasks
exec.shutdown();
// wait for results
for(Future<Object> result: results) {
Object obj = result.get();
}
于 2012-07-06T07:13:06.900 に答える
1
ExecutorService
、特にExecutors.newFixedThreadPool(int i)を見てください。これは、システムにやさしい問題でスレッドを処理する優れた方法です。
于 2012-07-06T07:12:27.970 に答える