我正在尝试绘制一个三角形启动多个线程,每个线程将绘制三角形的独立部分。但是它的运行速度要比仅使用一个线程慢得多。有什么问题?
这是代码:
(...)
int nCores = Runtime.getRuntime().availableProcessors();
Thread[] threads = new Thread[nCores];
int width = box[1][0] - box[0][0];
int incr = width / nCores;
int x = box[0][0];
for (int i = 0; i < nCores; i++) {
threads[i] = new Thread(new TriFiller(x, x + incr, z - nx * incr
* i));
threads[i].start();
x += incr;
}
try {
for (int i = 0; i < nCores; i++)
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
和可运行的:
public class TriFiller implements Runnable {
int xi, xf;
double z;
public TriFiller(int xi, int xf, double z) {
super();
this.xi = xi;
this.xf = xf;
this.z = z;
}
@Override
public void run() {
boolean inOut = false;
double z0 = z;
int rgbColor = shade.getRGB();
BufferedImage image = wd.getImage();
for (int i = xi; i < xf; i++) {
for (int j = box[0][1]; j < box[1][1]; j++) {
if (isOnSet(i, j, polyNormals, intBuffer)
&& z < zBuffer[i][j] && z > zd) {
image.setRGB(i, j, rgbColor);
zBuffer[i][j] = z;
inOut = true;
} else {
if (inOut) {
break;
}
}
z += -ny;
}
z0 += -nx;
z = z0;
inOut = false;
}
}
}
您遇到麻烦的原因是,摇摆绘画与多线程无法使用。从另一个论坛(jfree.org)中阅读此摘录:
"我认为您没有看到任何绩效改善的原因是,您没有通过旋转另一个线程来引入任何阶级。
更新屏幕的工作方式本质上是:
1)一旦组件决定应在屏幕上重新粉刷jcomponent.repaint()。这导致发送给RepaintManager的异步重涂要求,该请求使用InvokElater()在EDT上排队。
2)当可运行的执行操作时,它调用了RepaintManager,该重新man以下contement()都会在组件上调用paintim()。然后,组件设置夹子矩形并调用paint(),该绘制()最终调用您已覆盖的PaintComponent()。请记住,屏幕已锁定,并将保持锁定,直到组件完全重新粉刷脏矩形。
旋转线程以生成映像缓冲区没有意义,因为重新捕获器必须阻止直到缓冲区准备就绪,以便在释放屏幕上的锁之前完成更新脏矩形。
> 。所有摆动支持的工具包(Windows,Linux,Mac)都是通过设计螺纹的。不可能同时更新屏幕的一个以上区域。"