【问题标题】:Can all Asynchronous tasks read a ArrayList at sametime without anydelay所有异步任务可以同时读取一个 ArrayList 没有任何延迟
【发布时间】:2018-07-20 09:58:46
【问题描述】:

在我的 Android 应用中,我有一个如下所述的 arrayList。

Public List<String> prefCoinList = new ArrayList<String>() ;

如下所述,我将使用 THREAD_POOL_EXECUTOR 执行 10 个异步任务。

new asyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, order);

每个异步任务将读取 arrayList "prefCoinList" 并检查特定值。

问题

  1. 所有 10 个异步任务会在 arrayList "prefCoinList" 上运行而不会出现任何死锁吗?

  2. 会有任何线程锁/挂起问题吗?

  3. 如果可能同时读取数组列表,那么每个线程是否会获得自己的副本(或)所有线程将等待并在轮到它们时读取数组列表?

【问题讨论】:

    标签: java android multithreading asynchronous android-asynctask


    【解决方案1】:

    如果列表在构造后没有被修改,那么您可以从多个线程访问它而不会出现问题。每个线程将读取对象的单个副本。

    如果列表偶尔被修改,那么您可以使用ReadWriteLock 或其他访问控制机制。

    【讨论】:

      【解决方案2】:

      让我回答每个问题。 1) 是的,所有 10 个异步调用都将毫无问题地运行,需要处理的信息并不多。

      2)你不会有线程锁,你只需要注意使用 runOnUIThread 因为在那一刻它会停止异步调用。

      3) Java 函数通过对象的引用工作。所以,你有两个选择。您可以将相同的数组传递给异步函数,但不能对其进行修改,或者您可以为每个函数创建数组的副本以避免出现问题。

      【讨论】:

      • 您的观点3) 不正确。 Java 通过引用传递对象参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      相关资源
      最近更新 更多