Java 为什么我的程序会把我的电脑慢到一个无法使用的速度

Java 为什么我的程序会把我的电脑慢到一个无法使用的速度,java,Java,所以我刚刚开始学习java,我正在youtube上学习视频教程。我试着运行这段代码,它运行了,但它会减慢我的计算机速度,然后在不到一秒钟后冻结所有内容。怎么了?我也不知道这是否相关,但我目前正在linux机器上运行 package com.matt.rain; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.im

所以我刚刚开始学习java,我正在youtube上学习视频教程。我试着运行这段代码,它运行了,但它会减慢我的计算机速度,然后在不到一秒钟后冻结所有内容。怎么了?我也不知道这是否相关,但我目前正在linux机器上运行

package com.matt.rain;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

public class Game extends Canvas implements Runnable{
    private static final long serialVersionUID = 1L;

    public static int width = 300;
public static int height = width / 16 * 9;
public static int scale = 3;

private Thread thread;
private JFrame frame;
private boolean running = false;

public Game() {
    Dimension size = new Dimension(width * scale, height * scale);
    setPreferredSize(size);

    frame = new JFrame();
}


public synchronized void start() {
    running = true;
    thread = new Thread(this, "Display");
    thread.start();
}

public synchronized void stop() {
    running = false;
    try{
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
public void run(){
    int x = 1;
    while (running == true){
        System.out.println("Running..."+ x);
        update();
        render();
        x = x + 1;
    }
}

public void update(){


}

public void render(){
    BufferStrategy bs = getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        return;
    }

    Graphics g = bs.getDrawGraphics();
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, getWidth(), getHeight());
    g.dispose();
    bs.show();
}
public static void main(String[] args){
    Game game = new Game();
    game.frame.setResizable(false);
    game.frame.setTitle("Rain");
    game.frame.add(game);
    game.frame.pack();
    game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    game.frame.setLocationRelativeTo(null);
    game.frame.setVisible(true);

    game.start();

}
}

您可以通过在运行时在while循环中使用sleep来解决此问题

while (running == true){
    // System.out.println("Running..."+ x);
    try{Thread.sleep(50);}catch(Exception e){}
    update();
    render();
    x = x + 1;
}
添加睡眠将允许其他线程与您的程序一起工作,因此不会导致您的计算机停止响应


不过,我认为睡眠不是很准确。为了精确计时,您可能必须使用其他方法。

因为您正在以最大速度更新画布,这反过来会调用获取和释放图形对象,以及其他许多事情。我建议您查看javax.swing.Timer.GUIs和sleep,不要混合使用。@EJP感谢您提供的信息。我不确定它是否适用于这里,因为睡眠是在单独的线程上调用的,而不是在UI线程上调用的。因此它不会阻止EDT。render方法中的代码假定它正在EDT上被调用。@EJP您所说的假定是什么意思!在上面的代码中,睡眠是在不同于ETD的线程上调用的。你确定你知道你在说什么吗?而且睡眠不在渲染中,而是在线程运行中。请不要因为你在某个地方读到它而盲目地跟随它。