首页 > 解决方案 > 使用 BufferedImage 进行多线程绘图

问题描述

我有一个学校作业,我必须用多个线程在图像上绘制矩形。正在进行的形状不能重叠(即两个线程不能同时尝试在同一区域中绘制)我必须使用 get/setRGB 来执行此操作,但我正试图绕开我的头来提供该排除。我认为关键资源将是每个区域中的像素,那么我将如何让每个线程锁定单个像素?

标签: javamultithreadingbufferedimagejava-threadsthread-synchronization

解决方案


您需要一个 SpaceManager,这是一个集中式代理,它将管理分配给定 BufferedImage 的矩形区域。这将需要一个 allocateRectangle(int sizeX, int sizeY) 方法,该方法将找到未使用的空间,将其标记为已使用,并返回一个 DrawingRectangle,以及一个 freeRectangle(DrawingRectangle dr) 方法,该方法将在不再使用空间时释放空间.

DrawingRectangle 是您自己的类,它具有对 BufferedImage 的引用,并且它知道自己在其中的偏移量。它有自己的 get/setRGB 方法,只需添加其 X 和 Y 偏移量并调用 BufferedImage get/setRGB。因此,该系统的客户端只需获取一个 DrawingRectangle 并访问它,就好像它是它自己的 BufferedImage 一样,具有他们请求的大小。

这里的技巧是您的 allocateRectangle 和 freeRectangle 方法必须同步,以便分配一个的过程不会被另一个线程中断,然后另一个线程尝试分配它自己的。如果你想优化包装,管理二维空间是很棘手的,但我不会打扰,至少一开始是这样。只要把它想象成行是矩形在顶部对齐。如果下一个新行不适合现有行,请创建一个新行,从最低行的最高矩形下方开始。


推荐阅读