问题是当我在播放音乐时使用多于一个的线程开始执行繁重的任务时 - 播放正在破解(设置numOfCores = 2或更多)。 如果我设置numOfCores = 1 ,则播放正常。
我该如何避免这种情况?
注意:
予。在前景服务中通过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);
}
答案 0 :(得分:0)
@jameslarge你能解释一下吗?
您的代码示例非常粗略,我不知道android,但我查找了setThreadPriority()
函数,文档清楚地说它设置了调用的优先级线程。
在您的示例中设置自己的优先级的同一个线程继续创建一个带有一个或两个工作线程的线程池。这些工作者与设置的工作线程不同。
您的抱怨是,当有两名工作人员时,声音回放“噼里啪啦”,但当只有一名工作人员时,声音播放就可以了。这是有道理的:如果Android设备有两个处理器,并且您的线程池只有一个工作线程,那么总会有一个处理器可用于执行其他工作(例如,播放声音),但是如果您创建线程池两个工人,然后工人可以占用两个CPU,并且没有可用的CPU来播放声音。
因此,线程池工作者就是问题所在。但是您的代码不会降低线程池工作者的优先级。它降低了创建线程池的线程的优先级。也许,就我所知,这甚至是尝试播放声音的同一个线程。