/ / Definir uma prioridade de thread com multithreading não tem efeito - java, android, multithreading

Definir uma prioridade de thread com multithreading não tem efeito - java, android, multithreading

O problema é quando começo a executar tarefas pesadas usando mais threads que um enquanto reproduz música - a reprodução está rachando (Definindo numOfCores = 2 ou mais). Se eu definir numOfCores = 1 a reprodução está boa.

Como posso evitar isso?

NOTA:

  • Não quero usar a otimização porque quero ter realizado minhas tarefas como o mais rápido que posso.
  • Se eu tocar música usando outro aplicativo, tudo bem.

I. Tocando música usando o openSL ES via JNI em um Primeiro plano Serviço.

II Este código do AsyncTask iniciado em outro serviço.

@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);



}

Respostas:

0 para resposta № 1

@jameslarge Você poderia explicar por favor?

Seu exemplo de código é bastante superficial e eu não "t sabe android, mas eu procurei isso setThreadPriority() e a documentação diz claramente que define a prioridade do encadeamento de chamada.

O mesmo encadeamento que define sua própria prioridade emseu exemplo então cria um pool de threads com um ou dois threads de trabalho. Esses trabalhadores são threads diferentes daquele que define como prioridade própria.

Sua queixa é que, quando existem doisworkers, a reprodução de som "crepita", mas quando há apenas um trabalhador, a reprodução de som é OK. Isso faz sentido: se o dispositivo Android tiver dois processadores e seu pool de threads tiver apenas um trabalhador, sempre haverá um. processador que está disponível para fazer outras coisas (por exemplo, reproduzir som), mas se você criar o conjunto de encadeamentos com dois trabalhadores, eles poderão amarrar as duas CPUs e não deixar nenhuma CPU disponível para reproduzir o som.

Portanto, os trabalhadores do pool de threads são o problema. Mas seu código não diminui a prioridade dos trabalhadores do conjunto de encadeamentos. Reduz a prioridade do encadeamento que criado o pool de threads. Talvez, pelo que sei, esse seja o mesmo fio que está tentando reproduzir o som.