Android - 线程,可运行和并发数据访问

时间:2016-08-27 20:57:14

标签: java android multithreading concurrency runnable

在Android应用程序上工作时,我偶然发现了一些内容,希望得到您对该主题的意见/帮助。

所以,基本上,我创建了几个在不同线程中运行的Runnable。所有这些Runnable都会调用运行这些ApplyContrast(...)的类SomeClass中的方法Runnable(或多或少同时)。 此ApplyContrast(...)方法可访问和修改同一个类int[]的{​​{1}}。

所以我想知道这是否可能是一个问题? 我问这个是因为当我在一个以上的线程上运行时,我没有得到预期的结果。

P.S:即使有SomeClass的并发访问,线程也没有访问数组的相同部分(或者不应该这样做:P)

欢迎任何帮助。如果您需要更多信息,请询问。

int[]

更新#1:

添加更多关于(错误)结果的信息:

正如我上面所说,每当我在多个线程中进行数据处理时,我都无法获得预期的结果。 当数据处理在多个线程 中完成时,第一个线程(已运行)中处理的数据是正确的。

以下是一些图片,用于显示原始图像,预期结果以及多线程时获得的实际结果图像:

(不要介意图像顶部和底部的蓝色部分)

原始图片: enter image description here

预期的结果图片 enter image description here

实际生成的图片 enter image description here

你可以看到,在最后一张图片中我们有" 2部分"。第一部分(在顶部)是由第一个线程处理的(正确完成)和第二部分(在底部)由所有剩余线程处理(这是错误的)。

1 个答案:

答案 0 :(得分:0)

我认为没关系。

可以从多个线程访问数组pixels(可能别名为mPixels)。这会使它不正确。

但是,看起来您正在对数组进行分块访问,以便每个线程只访问自己的块。只要多个线程永远不会访问数组中的相同位置,代码就是正确的。

但是,我得说,这是非常令人困惑的。我会说变量len被错误命名。当然,并发正确性确实很难确定。我相信它可以写得更清楚,并且由于容易出错,所以非常值得这样做。