Java Graphics2d是否可以进行并行绘图操作?

Java Graphics2d是否可以进行并行绘图操作?,java,graphics,parallel-processing,Java,Graphics,Parallel Processing,我这里有一个小测试来演示这个问题 显然,代码可以工作,但是随着线程数的增加(假设有足够的内核),性能并没有得到提高 这就好像绘图操作是序列化的 import java.awt.*; 导入java.awt.image.buffereImage; 导入java.util.Date; 导入java.util.Random; 公共类测试{ 类DrawSomething实现Runnable{ @凌驾 公开募捐{ 随机r=新随机(); 长启动=新日期().getTime(); BuffereImage=新的

我这里有一个小测试来演示这个问题

显然,代码可以工作,但是随着线程数的增加(假设有足够的内核),性能并没有得到提高

这就好像绘图操作是序列化的

import java.awt.*;
导入java.awt.image.buffereImage;
导入java.util.Date;
导入java.util.Random;
公共类测试{
类DrawSomething实现Runnable{
@凌驾
公开募捐{
随机r=新随机();
长启动=新日期().getTime();
BuffereImage=新的BuffereImage(100100,BuffereImage.TYPE_INT_ARGB);
Graphics2D g2d=image.createGraphics();
对于(int i=0;i<100000;i++){
颜色c=新颜色(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));
}
}
公共线程测试(int线程){
for(int t=0;t0){
试一试{
threads=Integer.parseInt(args[0]);
System.out.println(“使用“+线程+”线程进行处理”);
}捕获(数字格式){
System.err.println(“参数“+”必须是整数”);
}
}
新试验(螺纹);
}
}

我从给定的代码中看到,您是在不同的“作业”线程中执行的。每个线程创建“他自己的”缓冲区图像并绘制一些东西

那么关于你的问题:

  • 如果希望通过并行/并发执行快速绘制,则需要在线程之间共享BuffereImage或Graphics*引用
这是一个关于编码器能否控制多核系统上线程处理方式的一般问题的特定版本。AWT中有一个大锁。(在JDK 6中作为内部锁,但由于性能原因被更改为
,几乎与HotSpot使用jucl升级其锁的时间完全相同。)我认为这可能会在这里发挥作用。谢谢Tom。我将研究开放jdk源代码,看看是否可以做任何事情;实际上,正如Tom Hawtin在上面提到的,问题是所有通过AWT的绘图操作都使用一个全局锁。