java - 如何 promise 完成多个线程?

标签 java android multithreading executorservice

我对 java 中的多线程概念有点陌生。
这个问题的标题可能与之前关于该主题的问题有相似之处,但尽管查看了答案,我仍然成功地完成了以下任务:

在 MainActivity 上说我有一个嵌套的 for 循环。在内部循环中,我正在运行另一个类的方法,该方法将接口(interface)作为回调,如下所示:

MainActivity.java

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_display_prices, container, false);

    return v;

    for (i = 0; i < 10; i++) {

        for (i = 0; i < 4; i++){
              CategoryItemsDataSource.getCategoryItemsData(url, new CategoryItemsDataSource.OnCategoryItemsDataArrived() {
                        @Override
                        public void onCategoryItemsDataArrived(List<ProductItem> data, Exception e) {
                             getActivity.runOnUiThread(new Runnable() {

                                   //display retrieved data on UIThread...
                             });

                        }
              });
        }
    }

}

CategoryItemDataSource.java

 public class CategoryItemsDataSource {

public interface OnCategoryItemsDataArrived {
    void onCategoryItemsDataArrived(List<ProductItem> data, Exception e);
}

public static void getCategoryItemsData(final String[] url, final OnCategoryItemsDataArrived listener){

    ExecutorService service = Executors.newSingleThreadExecutor();
    service.execute(new Runnable() {
        @Override
        public void run() {
            try {
                List<ProductItem> data = new ArrayList<>();
                //retreiving data from web and appending to List<> Data....
                }
                listener.onCategoryItemsDataArrived(data, null);
            } catch (Exception e) {
                e.printStackTrace();
                listener.onCategoryItemsDataArrived(null, e);
            }
        }
    });
    service.shutdown();
}

我不知道如何从 MainActivity 中的 CategoryItemDataSource 类 [I.E,如果我需要的话] 访问 ExecutorService 实例。因此,我应该如何确保/ promise 完成内部循环中生成的所有多个线程?

最佳答案

创建一个计数器变量;在循环中,每次将新任务提交给执行程序时递增计数器。在 onCategoryItemsDataArrived 方法中,递减该计数器;当它变为零时,所有任务都已完成。提供对计数器的原子访问:使用 AtomicIntegersynchronized 语句。

关于java - 如何 promise 完成多个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47738197/

相关文章:

Java:WAITING同步块(synchronized block),谁先走?

javascript - Android & Phonegap : error occurs when loading javascript function with loadUrl

java - Android ListView 像 Twitter 列表一样滑动操作

android - 缩放图像(Android Studio)

c++ - 对线程和对象无效使用 void 表达式

android - 如何在完成另一个线程后运行一个线程

java - Hibernate:如果字段存在某个值,则无法更新为新值

java - 枚举构造函数静态初始化器

Java 方法 - 将方法作为参数

WPF 调度程序 - 突然出现 "stuck"并且在按下某个键之前不处理操作