小编典典
除了事件分发线程(EDT),您不能让任何线程接触GUI。让其他线程与GUI混乱会导致麻烦和异常。您可以采用多线程多缓冲技术。它涉及两个步骤:
为了并行化复杂的绘制例程,您可以简单地将整个“视图”划分为小块,然后让一个线程将一个小块绘制为一张图像。这是有关使用Java处理图像的教程。
获得图像后,可以通过将相应补丁的图像拼接在一起,来覆盖paintComponent并使用Graphics.drawImage方法让EDT显示完整视图或部分视图。
为了避免不必要的工作,请确保先执行第一步,然后再更改视图后再执行,否则只需再次绘制先前计算的结果即可。此外,如果可以缩小视图内部在框架之间更改的区域的范围,请尝试仅更新部分补丁。
让我们假设您的视图至少与最佳线程数一样高,因此我们可以垂直划分视图。另外,我们假设绘制任何像素所需的工作量与其他像素差不多,因此我们可以为每个色块使用相同的大小。这两个假设使事情变得容易得多。
代码如下。如果您不需要计算机执行任何其他操作,则可以设置nThreads内核数。请注意,该代码还将伪代码用于“ parallel
for”,在此处进行了说明:
// let multiple threads write all patches
public BufferedImage[] writePatches(...)
{
// Given data:
const int nThreads = ...; // the amount of threads that you want
Rectangle viewBox = ...; // The view rectangle