我有一个类可以扩展JPanel并通过重写paint方法在屏幕上绘制约10张图像(使用此方法是因为我希望能够在绘制每个图像时操纵图像)。我想做的是在该类中有一个update方法,我每帧传递一个潜在的图像更新列表。这是我所拥有的

List<BufferedImage> imageList = Collections.synchronizedList(new ArrayList());

public void update(list<String> imagePaths) {
    for (String path : imagePaths) {
        synchronized (imageList) {
            //Modify image list adding and removing buffered images
        }
    }
    repaint();
}

@Override
public void paintComponent(Graphics g) {
     synchronized (imageList) {
         g.drawImage(img, 0, 0, this);
     }
}


您可以想象,由于同步块,当前运行非常慢吗?请问如何才能大大提高性能?

最佳答案

您正在使用同步列表,然后在对其进行迭代时也在该列表上进行同步。通过使用CopyOnWriteArrayList之类的东西,您可能会看到更好的性能,它在迭代时将始终提供一致的快照,并完全删除已同步的块。

尽管查看您的代码片段,但我不清楚正在迭代哪个列表-您有imageListimagePaths,并且我不确定从列表中检索到的实际图像是什么。

关于java - 简单的Java并发问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27859101/

10-10 05:59