javafx 的 canvas 不支持多线程直接绘图,导致并行渲染出现闪烁或崩溃;应改用 javafx 13+ 的 writableimage 配合底层 buffer 实现线程安全、高性能的并行像素写入。
在 JavaFX 中尝试对 Canvas 进行多线程分块渲染(例如计算 Mandelbrot 集合并逐区域绘制)时,必然遭遇 UI 线程限制问题:Canvas 的 GraphicsContext 只能由 JavaFX 应用线程(FX Application Thread)安全调用。任何从工作线程中调用 gc.setFill()、gc.fillRect() 或类似绘图操作,都会触发 IllegalStateException 或造成视觉 glitch(撕裂、闪烁、空白),即使使用 Platform.runLater() 包裹也难以避免同步开销与竞态——这正是你观察到“加 thread.join() 后正常但失去并行性”的根本原因。
✅ 正确解法:弃用 Canvas,转向 WritableImage + PixelWriter + ByteBuffer
自 JavaFX 13 起,WritableImage 支持通过 PixelWriter 直接访问底层 ByteBuffer(需启用 -Dprism.allowhidpi=false 等兼容配置,但非必需)。该 ByteBuffer 是纯内存数据结构,无线程访问限制,可被任意数量的工作线程并发写入不同内存区域(前提是严格划分像素坐标范围,避免越界或重叠)。
以下为关键实现步骤与示例代码: