/ / Das Setzen einer Thread-Priorität mit Multithreading hat keine Auswirkung - Java, Android, Multithreading

Das Festlegen einer Threadpriorität mit Multithreading hat keine Auswirkungen - Java, Android, Multithreading

Das Problem ist, wenn ich anfange, schwere Aufgaben mit mehr als einem Thread auszuführen, während ich Musik abspiele. Die Wiedergabe bricht (Festlegen von numOfCores = 2 oder mehr). Wenn ich numOfCores = 1 setze Die Wiedergabe ist in Ordnung.

Wie kann ich das vermeiden?

HINWEIS:

  • Ich möchte keine Drosselung verwenden, weil ich meine Aufgaben als erledigt haben möchte schnell wie ich kann.
  • Wenn ich mit einer anderen Anwendung Musik wiedergebe, ist das in Ordnung.

I. Musikwiedergabe mit openSL ES über JNI in a Vordergrund Bedienung.

II. Dieser Code von AsyncTask, der in einem anderen Dienst gestartet wird.

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



}

Antworten:

0 für die Antwort № 1

@jameslarge Könnten Sie bitte erklären?

Ihr Codebeispiel ist ziemlich lückenhaft, und ich nicht Ich kenne Android, aber das habe ich nachgeschlagen setThreadPriority() Funktion, und die Dokumentation sagt eindeutig, dass es die Priorität des aufrufenden Threads setzt.

Derselbe Thread, der seine eigene Priorität in setztIn Ihrem Beispiel wird dann ein Thread-Pool mit einem oder zwei Arbeitsthreads erstellt. Diese Arbeiter sind andere Themen als die, für die eigene Priorität festgelegt wurde.

Ihre Beschwerde ist, dass, wenn es zwei gibtArbeiter, die Soundwiedergabe "knistert", aber wenn es nur einen Arbeiter gibt, ist die Soundwiedergabe in Ordnung. Das macht Sinn: Wenn das Android-Gerät zwei Prozessoren hat und Ihr Thread-Pool nur einen Arbeiter hat, wird es immer einen geben Prozessor, der für andere Aufgaben zur Verfügung steht (z. B. zum Abspielen von Sound). Wenn Sie jedoch den Thread-Pool mit zwei Workern erstellen, können die Worker beide CPUs binden und es steht keine CPU zum Abspielen des Sounds zur Verfügung.

Die Thread-Pool-Arbeiter sind also das Problem. Ihr Code verringert jedoch nicht die Priorität der Thread-Pool-Worker. Es senkt die Priorität des Threads, der erstellt der Thread-Pool. Vielleicht, soweit ich weiß, ist das sogar derselbe Thread, der versucht, den Sound abzuspielen.