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