如何在java 7(android)中并行化嵌套循环

时间:2016-04-21 19:42:10

标签: java android parallel-processing

我有以下代码段

 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设备上运行得体。

1 个答案:

答案 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个任务完成,然后之后按顺序处理结果数组。