Java 为什么我的程序会把我的电脑慢到一个无法使用的速度
所以我刚刚开始学习java,我正在youtube上学习视频教程。我试着运行这段代码,它运行了,但它会减慢我的计算机速度,然后在不到一秒钟后冻结所有内容。怎么了?我也不知道这是否相关,但我目前正在linux机器上运行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
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的线程上调用的。你确定你知道你在说什么吗?而且睡眠不在渲染中,而是在线程运行中。请不要因为你在某个地方读到它而盲目地跟随它。