我有以下代码段
String result;
for (int s1 = 0; s1 < 10; s1++)
for (int s2 = 0; s2 < 100; s2++)
for (int s3 = 0; s3 < 10; s3++)
for (int s4 = 0; s4 < 100; s4++)
{
result = doSomething(s1, s2, s3, s4);
if (result != null)
addResult(result); //adds results to an ArrayList of strings
}
如何将此代码并行化以使其更快?我在这里看到了类似的帖子,并行化了一个循环,但是我想平均并行化整个事情,使它在Android设备上运行得体。
答案 0 :(得分:1)
您可以使用AsyncTask
来并行执行每个s1
执行,例如:
for (int s1 = 0; s1 < 10; s1++)
{
new AsyncTask<Integer, Object, ArrayList<String>>()
{
@Override
protected ArrayList<String> doInBackground(Integer... params)
{
ArrayList<String> results = new ArrayList<>();
for (int s2 = 0; s2 < 100; s2++)
{
for (int s3 = 0; s3 < 10; s3++)
{
for (int s4 = 0; s4 < 100; s4++)
{
results.add(doSomething(params[0], s2, s3, s4));
}
}
}
return results;
}
@Override
protected void onPostExecute(ArrayList<String> results)
{
for(String result : results) {
if (result != null)
addResult(result);
}
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, s1);
};
请注意,这假定addResult
调用的顺序无关紧要,当然doSomething
调用不会通过修改某些共享状态而相互干扰。
如果addResult
调用的顺序很重要,您可以通过创建所有结果的数组来解决此问题,等待它们全部完成(通过创建计数器,等待所有10个任务完成,然后之后按顺序处理结果数组。