/ / Définir une priorité de fil avec le multithreading n’a aucun effet

La définition d’une priorité de fil avec le multithreading n’a aucun effet - java, android, multithreading

Le problème, c’est quand je commence à exécuter une tâche lourde en utilisant plus de threads que je joue tout en jouant de la musique - la lecture craque (Paramètre numOfCores = 2 ou plus). Si je mets numOfCores = 1 la lecture est ok.

Comment puis-je éviter ça?

REMARQUE:

  • Je ne veux pas utiliser la régulation parce que je veux avoir accompli mes tâches vite que je peux.
  • Si je joue de la musique en utilisant une autre application, c'est bien.

I. Jouer de la musique avec openSL ES via JNI dans un Premier plan Un service.

II. Ce code de AsyncTask qui est démarré dans un autre service.

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



}

Réponses:

0 pour la réponse № 1

@jameslarge Pourriez-vous expliquer s'il vous plaît?

Votre exemple de code est assez sommaire, et je don "t savoir Android, mais j'ai levé les yeux que setThreadPriority() fonction, et la documentation indique clairement qu’elle définit la priorité du fil d’appel.

Le même fil qui définit sa propre priorité dansvotre exemple continue ensuite pour créer un pool de threads avec un ou deux threads de travail. Ces travailleurs sont des threads différents de celui qui définit sa propre priorité.

Votre plainte est que, quand il y a deuxtravailleurs, la lecture du son "crépite", mais quand il n’ya qu’un seul travailleur, la lecture du son est OK. C’est logique: si le périphérique Android a deux processeurs et que votre pool de threads ne compte qu’un seul travailleur, il y en aura toujours processeur disponible pour d'autres tâches (par exemple, lecture du son), mais si vous créez le pool de threads avec deux travailleurs, ceux-ci peuvent alors lier les deux processeurs et ne laisser aucun processeur disponible pour reproduire le son.

Le problème est donc les travailleurs du pool de threads. Mais votre code ne réduit pas la priorité des travailleurs du pool de threads. Il diminue la priorité du fil qui créé le pool de threads. Peut-être, pour autant que je sache, c’est le même fil qui essaie de jouer le son