2
我在这里做了一些测试来证明这个问题。Java Graphics2d可以执行并行绘图操作吗?
很明显,代码可以工作,但是当你增加线程数量(假设有足够的内核)时,性能不会提高。
就好像绘图操作是序列化的。
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Date;
import java.util.Random;
public class Para2dTest {
class DrawSomething implements Runnable {
@Override
public void run() {
Random r = new Random();
long start = new Date().getTime();
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = image.createGraphics();
for (int i = 0; i < 100000; i++) {
Color c = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
g2d.setPaint(c);
g2d.fillRect(0, 0, 100, 100);
}
g2d.dispose();
long end = new Date().getTime();
System.out.println(Thread.currentThread().getName() + " " + (end - start));
}
}
public Para2dTest(int threads) {
for (int t = 0; t < threads; t++) {
Thread ds = new Thread(new DrawSomething());
ds.start();
}
}
public static void main(String[] args) {
System.setProperty("java.awt.headless", "true");
int threads = 16;
if (args.length > 0) {
try {
threads = Integer.parseInt(args[0]);
System.out.println("Processing with " + threads + " threads");
} catch (NumberFormatException e) {
System.err.println("Argument" + " must be an integer");
}
}
new Para2dTest(threads);
}
}
这是[多次问]的特定版本(http://stackoverflow.com/questions/1223072/how-do-i-optimize-for-multi-core-and-multi-cpu- computers-in-java)关于编码器是否可以控制在多核系统上如何处理线程的一般疑问。 – 2012-03-31 13:17:24
AWT有一个大锁。 (作为固有锁,但由于性能原因,在JDK 6中更改为'Lock',几乎与HotSpot使用jucl锁定它的同时)。我认为这可能会在这里发挥作用。 – 2012-03-31 13:22:21
谢谢汤姆。我会研究开放的jdk源代码,看看是否可以做任何事情。 – Johnny 2012-03-31 14:44:34