我有一项学校作业,我必须使用多个线程在图像上绘制矩形。 正在进行的形状不能重叠(即两个线程不能同时尝试在同一区域中绘制) 我必须使用 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 方法必须同步,这样分配一个方法的过程就不会被另一个尝试分配自己的线程中断。如果您想优化包装,管理二维空间会很棘手,但我不会打扰,至少一开始是这样。只需将其想象为矩形在顶部对齐的行。如果下一个新行无法放入现有行,请在最低行的最高矩形下方开始创建一个新行。
关于java - 使用BufferedImage进行多线程绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59922135/