2

Android用のダウンロードアプリをやっています。ダウンロード部分が正常に実装され、機能するようになりました。私が必要とするのは、ファイルをセグメントで並行してダウンロードすることです。より明確にするために、ユーザーが 8 つのセグメントを指定した場合、8 つのスレッドを作成してダウンロードを実行したいと考えています。では、どうすれば 8 つのスレッドを動的に作成できるのでしょうか? また、電話でこれを行っているので、メモリ消費を最小限に抑えるにはどうすればよいですか? これまでスレッドで作業したことがないので、これで私を助けてくれることを願っています. お時間をいただきありがとうございます!:)

4

2 に答える 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 に答える