使用 BufferedImage 进行多线程绘图
Multithreading drawing using BufferedImage
我有一个学校作业,我必须用多个线程在图像上绘制矩形。
正在进行的形状不能重叠(即两个线程不能同时尝试在同一区域中绘制)
我必须使用 get/setRGB 来执行此操作,但我正在努力解决提供该排除项的问题。
我认为关键资源是每个区域中的像素,那么我如何让每个线程锁定单个像素?
您需要有一个 SpaceManager,这是一个集中式代理,它将管理为给定的 BufferedImage 分配矩形区域。这将需要一个 allocateRectangle(int sizeX, int sizeY) 方法,它将找到未使用的 space,将其标记为已使用,return 一个 DrawingRectangle,以及一个 freeRectangle(DrawingRectangle dr) 方法,它将释放space 不再使用时。
DrawingRectangle 是您自己的 class,它引用了 BufferedImage 并且它知道自己在其中的偏移量。它有自己的 get/setRGB 方法,仅添加其 X 和 Y 偏移量并调用 BufferedImage get/setRGB。因此,该系统的客户端只需获取一个 DrawingRectangle 并访问它,就好像它是具有他们请求的大小的自己的 BufferedImage 一样。
这里的诀窍是您的 allocateRectangle 和 freeRectangle 方法必须同步,这样分配一个的过程不会被另一个线程中断,而另一个线程随后尝试分配自己的。如果您要优化包装,管理 2-D space 是很棘手的,但我不会打扰,至少一开始是这样。只需将其视为行,矩形在顶部对齐。如果下一个新的不适合现有的行,请创建一个新行,从最低行的最高矩形下方开始。
我有一个学校作业,我必须用多个线程在图像上绘制矩形。 正在进行的形状不能重叠(即两个线程不能同时尝试在同一区域中绘制) 我必须使用 get/setRGB 来执行此操作,但我正在努力解决提供该排除项的问题。 我认为关键资源是每个区域中的像素,那么我如何让每个线程锁定单个像素?
您需要有一个 SpaceManager,这是一个集中式代理,它将管理为给定的 BufferedImage 分配矩形区域。这将需要一个 allocateRectangle(int sizeX, int sizeY) 方法,它将找到未使用的 space,将其标记为已使用,return 一个 DrawingRectangle,以及一个 freeRectangle(DrawingRectangle dr) 方法,它将释放space 不再使用时。
DrawingRectangle 是您自己的 class,它引用了 BufferedImage 并且它知道自己在其中的偏移量。它有自己的 get/setRGB 方法,仅添加其 X 和 Y 偏移量并调用 BufferedImage get/setRGB。因此,该系统的客户端只需获取一个 DrawingRectangle 并访问它,就好像它是具有他们请求的大小的自己的 BufferedImage 一样。
这里的诀窍是您的 allocateRectangle 和 freeRectangle 方法必须同步,这样分配一个的过程不会被另一个线程中断,而另一个线程随后尝试分配自己的。如果您要优化包装,管理 2-D space 是很棘手的,但我不会打扰,至少一开始是这样。只需将其视为行,矩形在顶部对齐。如果下一个新的不适合现有的行,请创建一个新行,从最低行的最高矩形下方开始。