java - 使用BufferedImage进行多线程绘图

标签 java multithreading bufferedimage java-threads thread-synchronization

我有一项学校作业,我必须使用多个线程在图像上绘制矩形。 正在进行的形状不能重叠(即两个线程不能同时尝试在同一区域中绘制) 我必须使用 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/

相关文章:

c++ - QSocketNotifier : Socket notifiers cannot be enabled or disabled from another thread

java - JAVA中像素改变后的图像实现

java - 裁剪图像的透明边缘

java - 为什么 BufferedImage 输出看起来与 Linux 平台上 JFrame 窗口中的屏幕不同?

java - 为什么 playorm 没有构建?

集成 Windows Small Business Server 的 Java 应用程序

.net - 我认为我正在处理的未处理的 FileLoadException

java - 无法退出用于 JOptionPane 的 try-catch block

Java - 要在 Jtable 中显示的 Arraylist 内容

java - 从 Servlet 请求生成线程