/ / Ustawienie priorytetu wątku za pomocą wielowątkowości nie ma wpływu - Java, Android, wielowątkowość

Ustawienie priorytetu wątku za pomocą wielowątkowości nie ma żadnego efektu - java, android, wielowątkowość

Problem polega na tym, że kiedy zaczynam wykonywać ciężkie zadanie, używając więcej niż jednego wątku podczas odtwarzania muzyki - odtwarzanie pęka (Ustawienie numOfCores = 2 lub więcej). Jeśli ustawię numOfCores = 1 odtwarzanie jest w porządku.

Jak mogę tego uniknąć?

UWAGA:

  • Nie chcę korzystać z ograniczania przepustowości, ponieważ chcę wykonać swoje zadania jako tak szybko jak potrafię.
  • Jeśli odtwarzam muzykę za pomocą innej aplikacji, jest w porządku.

I. Odtwarzanie muzyki za pomocą openSL ES przez JNI w a Pierwszoplanowy Usługa.

II. Ten kod AsyncTask uruchamiany w innej usłudze.

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



}

Odpowiedzi:

0 dla odpowiedzi № 1

@jameslarge Czy możesz to wyjaśnić?

Twój przykład kodu jest dość szkicowy, a ja don "t znam androida, ale to sprawdziłem setThreadPriority() funkcji, a dokumentacja wyraźnie mówi, że ustawia priorytet wątku wywołującego.

Ten sam wątek, który określa własny priorytetTwój przykład następnie tworzy pulę wątków z jednym lub dwoma wątkami roboczymi. Ci pracownicy mają inne wątki niż ten, który ma własny priorytet.

Twoja skarga polega na tym, że gdy są dwapracowników, odtwarzanie dźwięku „pęka”, ale gdy jest tylko jeden pracownik, odtwarzanie dźwięku jest OK. To ma sens: jeśli urządzenie z Androidem ma dwa procesory, a pula wątków ma tylko jednego pracownika, to zawsze będzie jeden procesor, który jest dostępny do robienia innych rzeczy (np. odtwarzania dźwięku), ale jeśli utworzysz pulę wątków z dwoma procesami roboczymi, pracownicy mogą powiązać oba procesory i nie pozostawiać żadnego dostępnego procesora do odtwarzania dźwięku.

Problemem są pracownicy puli wątków. Ale twój kod nie obniża priorytetu pracowników puli wątków. Obniża priorytet wątku, który stworzony pula wątków. Może, z tego co wiem, to nawet ten sam wątek, który próbuje odtworzyć dźwięk.