使用缓冲图像的多线程绘图



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

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

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

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

最新更新