等待线程池完成执行

时间:2014-02-18 18:48:16

标签: java android multithreading threadpool

我是线程新手。我搜索了许多与我的问题相关的问题,但我无法为我找到合适的解决方案。我正在做的是我使用四个异步任务使用THREAD_POOL_EXECUTOR从四个不同的社交媒体中获取数据。 代码如下。

new Fb().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new Twitter().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
...

mAdapter = new MyAdapter(getActivity(),
                (ArrayList<Model>) showList);
mListView.setAdapter(mAdapter);

我希望调用并行以节省获取数据的时间。现在的想法是,我希望所有四个线程完成工作,之后我想按时间戳显示排序数据。现在问题是我的setAdapter在四个线程完成获取数据之前被调用,因为在UI线程上设置了适配器。我想要一种机制来阻止UI线程,直到所有四个线程完成获取数据。

我发现也许我可以使用ExecutorService的shutDown()和awaitTermination()方法。如果有人能帮助我,那将是很棒的。非常感谢

4 个答案:

答案 0 :(得分:1)

我要做的是:

  1. 在您的活动中创建一个空的ArrayList
  2. 将此arrayList传递给适配器并在ListView上设置适配器。 setAdapter方法不会影响listView - 因为列表为空,它仍然是空的。
  3. 启动4 AsyncTasks并获取数据。在onPostExecute()中将此数据添加到ArrayList并在适配器上调用notifyDatasetChanged()。
  4. 你永远不应该阻止UI线程,因为它是错误的。如果希望一次显示所有数据,可以创建一个简单的计数器,在每个onPostExecute中创建counter ++,并仅在counter为4时调用notifyDatasetChange()。

答案 1 :(得分:0)

ExecutorService 调用方法关闭()

启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

答案 2 :(得分:0)

如果你真的可以阻止UI线程,试试这个:

new Fb().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new Twitter().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
...

AsyncTask.THREAD_POOL_EXECUTOR.shutdown();

while (!AsyncTask.THREAD_POOL_EXECUTOR.isTerminated()) {}

mAdapter = new MyAdapter(getActivity(),
                (ArrayList<Model>) showList);
mListView.setAdapter(mAdapter);

在大多数情况下,阻止UI线程不是一个好主意。

答案 3 :(得分:0)

我可以成功处理问题而无需深入了解线程。我使用了在执行每个线程后使布尔值成为真的简单概念。在UI线程中,我检查了infinte时间,即

while(true)
{
    if(flag1 && flag2 && flag3 && flag4)
    {
       //set the adapter and make the flags false 
       break;
    }

}

不要忘记将falgs弄错,否则执行将无限期地继续。