1

我知道要在 Android 中保持响应式界面,必须在独立线程中完成繁重的工作。我很清楚如何实现这一点(通过使用 AsynTask ...等),这不是问题的重点,只是为了让每个人都知道。

但是我一直在努力使用一个非常简单的并行程序。该程序搜索数组中长度为 15000000 的最小整数。

我实现了这个可运行的:

...

run(){

    highestInteger = integers[firstIndex];

    for(int i = firstIndex; i < secondIndex; i++){
        if(highestInteger<integers[i]){
            highestInteger = integers[i];
        }
    }

}

...所以我可以在数组的前半部分(在一个线程中)中查找最高整数,并在数组的另一半中(在第二个线程中)查找最高整数。

该程序在我的计算机上运行良好(作为 java/not-android 程序),我的意思是并行时间比串行时间短(几乎一半)。

但是在我的 android 平板电脑(4 核)上,时间通常是相同的,而串行的几乎总是更短。

我确实注意到(使用调试器)在我的平板电脑中有几个线程正在运行:

  1. 主/ui线程(剩下3个核心)
  2. Binder 1 线程(剩余 2 个核心)
  3. Binder 2 线程(剩下 1 个核心:()
  4. Binder 3 线程(有时我在调试器中看到它,有时我没有)。

所以有 3 个线程正在运行,我需要至少 2 个空闲内核才能让我的程序高效运行。我读过一些关于活页夹线程的文章,但我不太了解。

有没有办法解决这个问题?有没有办法可以避免自动创建这些活页夹线程?或者在我们拥有 6 核设备之前不可能让这种线程工作?

4

1 回答 1

0

我确实注意到(使用调试器)在我的平板电脑中有几个线程正在运行

您已经创建了几个线程。大多数将被阻塞等待 I/O。

有没有办法解决这个问题?

内核分配的决定是由操作系统决定的,并且会考虑其他程序,加上功耗(让所有四个内核始终运行对电池来说真的很糟糕),正如 Andy Fadden(核心 Android 团队)在这个 SO 评论这个 SO 评论中指出。请注意,目前使用的 Android 设备约为 7.5 亿台,其中绝大多数的内核少于四个,而且大多数只有一个内核,因此您也需要考虑到这一点。

有没有办法可以避免自动创建这些活页夹线程?

只是不编写Android应用程序。这些线程用于进程间通信,这对于运行 Android 应用程序至关重要。

或者在我们拥有 6 核设备之前不可能让这种线程工作?

这当然是可能的。Andy Fadden 在这个 StackOverflow 答案中演示了它。如文档中所述,可能有一些方法可以重新组织您的算法以更好地在 Android 上使用 SMP 。您也可以考虑将 Renderscript Compute 作为使用 Java 工作的替代方案。

于 2013-05-04T19:30:58.567 回答