【发布时间】:2015-06-29 12:33:28
【问题描述】:
我想在我的 Android 应用程序中处理位图 - 位图可能很大,所以我使用多线程来执行更快的操作。这是我的代码(Runnable child 的一部分):
@Override
public void run() {
int imageHeight = filter.getBitmap().getHeight();
int start = threadNumber * imageHeight / threadCount;
int stop = (threadNumber + 1) * imageHeight / threadCount;
for (int j = start; j < stop; j++) {
filter.processLine(j);
}
}
//...
protected void processLine(int lineNumber)
{
int width = bitmap.getWidth();
int pixels[] = new int[width];
bitmap.getPixels(pixels, 0, width, 0, lineNumber, width, 1);
for (int i = 0; i < width; i++) {
pixels[i] = processPixel(pixels[i]);
}
bitmap.setPixels(pixels, 0, width, 0, lineNumber, width, 1);
}
当我在池中只使用 1 个线程时,一切正常。不幸的是,当我使用的线程数等于处理器的核心数(我的设备中为 4)时,结果如下(用于灰度过滤器):
有时看起来像:
- bitmap.getPixels(...) 不起作用,因为输出中有黑线
- bitmap.setPixels(...) 不起作用,因为输出中有未更改的行
我说的对吗?这些函数是线程不安全的吗?我应该如何执行多线程位图过滤才能快速且线程安全?
【问题讨论】:
标签: java android multithreading image-processing thread-safety