簡體   English   中英

使用多線程設置線程優先級無效

[英]Setting a thread priority with multithreading has no effect

問題是當我在播放音樂時使用多於一個的線程開始執行繁重的任務時 - 播放開始崩潰(設置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);



     }

@jameslarge你能解釋一下嗎?

你的代碼示例非常粗略,我知道android,但我查找了setThreadPriority()函數,文檔清楚地說它設置了調用線程的優先級。

在您的示例中設置自己的優先級的相同線程繼續創建具有一個或兩個工作線程的線程池。 這些工作者與設置優先級的工作者不同。

你的抱怨是,當有兩個工作人員時,聲音回放“噼里啪啦”,但當只有一個工作人員時,聲音播放就可以了。 這是有道理的:如果Android設備有兩個處理器,並且您的線程池只有一個工作線程,那么總會有一個處理器可用於執行其他工作(例如,播放聲音),但是如果您創建線程池兩個工人,然后工人可以占用兩個CPU,並留下沒有可用的CPU來播放聲音。

因此,線程池工作者就是問題所在。 但是您的代碼不會降低線程池工作者的優先級。 它降低了創建線程池的線程的優先級。 也許,就我所知,這甚至是嘗試播放聲音的同一個主題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM