有人可以帮助我理解一行一行是怎么回事,在这段代码的渲染方法



我也不完全理解volatile和synchronized修饰符的作用。但基本上,这应该是我从YouTube系列中学习的游戏的开始,到目前为止,它所做的只是启动一个线程,其中有一个while循环,在更新和渲染方法中运行。问题是,除了颜色的设置和矩形的创建,我对渲染方法中的任何东西都不了解。

package game;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
public class Game implements Runnable {
    public static Thread Game;
    public volatile boolean running = false;
    public void start() {
        running = true;
        Game = new Thread(this);
        Game.start();
    }
    public synchronized void stop() {
        running = false;
        try {
            Game.join();
        } catch (InterruptedException e) {
            System.out.println("asddsa");
        }
    }
    public void update() {
    }
    public void render() {
        BufferStrategy bs = GameFrame.GraphicsBoard.getBufferStrategy();
        if (bs == null) {
            GameFrame.GraphicsBoard.createBufferStrategy(3);
            return;
        }
        Graphics g = bs.getDrawGraphics();
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, GameFrame.GraphicsBoard.getWidth(),
                GameFrame.GraphicsBoard.getHeight());
        g.dispose();
        bs.show();
    }
    public synchronized void run() {
        new GameFrame();
        while (running) {
            update();
            render();
        }
    }
}

挥发性

Volatile在Java中被用作Java编译器和线程的指示器,这些编译器和线程不缓存该变量的值,并且总是从主存中读取它。

在这个代码示例中,一个线程(游戏线程)可以缓存"运行"的值,而不是每次从主内存中获取它,如果在任何其他线程之间改变值;这个线程不会看到它。将布尔变量"running"在java中设置为volatile可确保不会发生这种情况。

同步

使用

Synchronized使你的方法线程安全。

编辑:长答案如下。

如果你的代码是在多线程环境中执行的,那么你需要对多线程共享的对象进行同步,以避免任何状态损坏或任何类型的意外行为。

Java中的

synchronized关键字提供了锁,保证了共享资源的互斥访问,防止了数据竞争。此外,线程需要在访问同步的代码块之前获得锁。

同步可以在整个方法或特定块中完成。这个例子展示了方法同步。意味着整个方法被锁定,在任何时候只有一个线程可以访问你的方法。

不建议使用

方法同步,因为它可能会降低性能。还有其他的优点和缺点,我没有在这个回复中讨论。

最新更新