java - 等待线程池完成执行

标签 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);

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

我发现也许我可以使用 ExecutorService 的 shutdown() 和 waitTermination() 方法。无论如何,如果有人能帮助我,那就太好了。非常感谢

最佳答案

我会做的是:

  1. 在您的 Activity 中创建一个空的 ArrayList
  2. 将此 arrayList 传递给您的适配器并在 ListView 上设置适配器。 setAdapter 方法不会影响 listView - 它仍然是空的,因为列表为空。
  3. 启动 4 个异步任务并获取数据。在 onPostExecute() 中将此数据添加到 ArrayList 并在适配器上调用 notificationDatasetChanged()。

您永远不应该阻塞 UI 线程,因为这是错误的。当您希望一次显示所有数据时,您可以创建一个简单的计数器,在每个 onPostExecute 中创建 counter++ 并仅在计数器为 4 时调用 notificationDatasetChange() 。

关于java - 等待线程池完成执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21862725/

相关文章:

java - 在 Google App Engine Java 开发服务器中处理大型数据集的最佳方式是什么?

android - 无法在棉花糖版本的外部存储中创建文件夹

android - 刷新恢复镜像后,在 Ubuntu 中不再检测到 Nexus 7

android - Android后台返回的Volley和处理数据

java - Java中如何从一个线程中的另一个线程获取数据?

java - 如何刷新 NetBeans 中的自定义 bean?

java - 热衷于使用可选参数对 JSNI 函数进行建模?

android - 如何使用 Android 教程代码修复 'cannot be resolved or is not a type' 错误?

c++ - PThread - 尽管调用了 pthread_join,但线程提前退出

java - 无法解析配置 ':pushwoosh-react-native-plugin:classpath' 的所有 Artifact