/ /マルチスレッドでスレッドの優先度を設定しても効果がない-Java、Android、マルチスレッド

マルチスレッドでスレッド優先度を設定しても効果はありません - java、android、multithreading

問題は、音楽の再生中に複数のスレッドを使用して重いタスクを実行し始めるときです- 再生が割れています (numOfCores = 2以上の設定)。 numOfCores = 1に設定した場合 再生は大丈夫です。

どうすればこれを避けることができますか?

注意:

  • 「次のようにタスクを実行したいので、スロットルを使用したくない」 できるだけ早く。
  • 別のアプリケーションを使用して音楽を再生する場合は問題ありません。

I. JNIでopenSL ESを使用して音楽を再生する 前景 サービス。

II。別のサービスで開始されるこのAsyncTaskのコード。

@Override
protected Void doInBackground(String... params)
{
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
class Worker implements Runnable
{
@Override
public void run()
{
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
//Heavy work using jni here
}
}
numOfCores = 1; //The phone has 8 cores
final ExecutorService es = Executors.newFixedThreadPool(numOfCores);
//Adding the workers to es
for(...)
{
es.execute(new Worker());
}
es.shutdown();
es.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);



}

回答:

回答№1は0

@jameslarge説明してください。

あなたのコード例はかなり大ざっぱで、私は ドン "t アンドロイドを知っているが、私はそれを調べた setThreadPriority() 関数、およびドキュメントは呼び出しスレッドの優先順位を設定することを明確に述べています。

で独自の優先度を設定する同じスレッド次に、1つまたは2つのワーカースレッドでスレッドプールを作成します。これらのワーカーは、独自の優先順位が設定されているワーカーとは異なるスレッドです。

あなたの不満は、2つあるときですワーカー、サウンドの再生は「パチパチ」しますが、ワーカーが1人だけの場合、サウンドの再生はOKです。それは理にかなっています。Androidデバイスにプロセッサが2つあり、スレッドプールにワーカーが1つしかない場合、常に1つ他の処理(サウンドの再生など)を実行できるプロセッサですが、2つのワーカーでスレッドプールを作成すると、ワーカーは両方のCPUを拘束し、サウンドを再生するためのCPUを使用できなくなります。

したがって、スレッドプールワーカーが問題です。ただし、コードはスレッドプールワーカーの優先度を下げません。スレッドの優先度を下げます 作成した スレッドプール。たぶん、私が知っている限り、それはサウンドを再生しようとしているのと同じスレッドです。