java - 使用多线程设置线程优先级没有效果

标签 java android multithreading

问题是,当我在播放音乐时开始使用多个线程执行繁重的任务时 - 播放破裂(设置 numOfCores = 2 或更多)。 如果我设置 numOfCores = 1 播放正常。

如何避免这种情况?

注意:

  • 我不想使用限制,因为我想完成我的任务 尽可能快。
  • 如果我使用其他应用程序播放音乐就可以。
<小时/>

我。在前台服务中通过 JNI 使用 openSL ES 播放音乐。

二.在另一个服务中启动的 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 Could you explain please?

您的代码示例非常粗略,我了解android,但我查找了setThreadPriority()函数,并且文档清楚地表明它设置了调用线程的优先级。

在示例中设置自己的优先级的同一线程然后继续创建一个具有一个或两个工作线程的线程池。这些工作线程与设置自身优先级的线程是不同的线程。

您的提示是,当有两个 worker 时,声音播放“噼啪”,但当只有一名 worker 时,声音播放正常。这是有道理的:如果 Android 设备有两个处理器,并且您的线程池只有一个工作线程,那么总会有一个处理器可用于执行其他操作(例如,播放声音),但如果您使用两个工作线程创建线程池,则工作线程可以占用两个 CPU,而没有可用的 CPU 来播放声音。

所以,线程池工作人员就是问题所在。但是您的代码不会降低线程池工作线程的优先级。它降低了创建线程池的线程的优先级。据我所知,也许这甚至是尝试播放声音的同一个线程。

关于java - 使用多线程设置线程优先级没有效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37585119/

相关文章:

java - Android 应用开发 : java vs. jquery mobile

android如何将EditText光标设置到其文本的末尾

c# - 在 C# Winforms 中使用多线程的响应式 GUI

android - 如何在 BehaviorSubject 中设置默认值

java - 如果我只想要一种在线程之间发出信号的方法,为什么我在哪个对象上使用 wait()/notify() 很重要?

C# - 周期性数据读取和 Thread.Sleep()

java - 方法 getLogger() 不再是 log4j2 中 Logger 的成员?

java - MyBatis - 与 MySQL 的连接随机断开

java - GCM token 验证

java - 时区转换