java - 使用 BufferedImage 进行多线程绘图
问题描述
我有一个学校作业,我必须用多个线程在图像上绘制矩形。正在进行的形状不能重叠(即两个线程不能同时尝试在同一区域中绘制)我必须使用 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 方法必须同步,以便分配一个的过程不会被另一个线程中断,然后另一个线程尝试分配它自己的。如果你想优化包装,管理二维空间是很棘手的,但我不会打扰,至少一开始是这样。只要把它想象成行是矩形在顶部对齐。如果下一个新行不适合现有行,请创建一个新行,从最低行的最高矩形下方开始。
推荐阅读
- python - 如何评估预训练模型 Tensorflow 对象检测 API
- python - 由于 cmake 错误,无法安装 python 包
- django - 在生产 django 中播种数据的正确方法
- c++ - ofstream 没有正确命名创建的文件
- python - django - 我可能搞砸了我的 setting.py 文件还是我的代码有问题?
- swift - 添加切换以列出 SwiftUI 并在用户登录时保存切换状态
- salesforce - 有没有办法解决 List 的非法转换
列出 在 SForce Apex 中? - php - 发送 Google Calendar API 确认电子邮件
- matlab - 为什么 Matlab 中的 readmatrix 会跳过前 n 行?
- c++ - 构造函数后面的宏。这是什么意思?