Android で応答性の高いインターフェイスを維持するには、重い作業を独立したスレッドで完了する必要があることを私は知っています。これを達成する方法(AsynTask ...などを使用して)をよく理解していますが、これは質問のポイントではなく、誰もが知っていることです。
しかし、私は非常に単純な並列プログラムでしばらく苦労してきました。このプログラムは、長さが 15000000 である配列の最小整数を検索します。
このランナブルを実装しました:
...
run(){
highestInteger = integers[firstIndex];
for(int i = firstIndex; i < secondIndex; i++){
if(highestInteger<integers[i]){
highestInteger = integers[i];
}
}
}
...したがって、配列の前半 (1 つのスレッド) で最大の整数を探し、配列の残りの半分 (2 番目のスレッド) で最大の整数を探すことができます。
このプログラムは私のコンピューターで (Java/Android 以外のプログラムとして) 非常にうまく動作します。つまり、並列時間がシリアル時間よりも短い (ほぼ半分) ことを意味します。
しかし、私の Android タブレット (4 コア) では、多くの場合、時間は同じであり、シリアルのものはほとんど常に短くなっています。
タブレットでいくつかのスレッドが実行されていることに (デバッガーで) 気づきました。
- メイン/UI スレッド (残り 3 コア)
- バインダー 1 スレッド (残り 2 芯)
- バインダー 2 スレッド (残り 1 芯:( )
- Binder 3 スレッド (デバッガーで表示される場合と表示されない場合があります)。
したがって、3 つのスレッドが実行されており、プログラムを効率的に実行するには、少なくとも 2 つの空きコアが必要です。バインダースレッドについて少し読んだことがありますが、よくわかりません。
これを解決する方法はありますか?これらのバインダー スレッドの自動作成を回避する方法はありますか? それとも、6 コア デバイスのようになるまで、この種のスレッド化を機能させることはできませんか?