【发布时间】:2018-03-05 00:20:30
【问题描述】:
我正在尝试创建一些小游戏,其中在一个线程中运行一个无限循环,该循环将执行引擎工作,而在 JFrame 中将是屏幕上输出的所有内容。
但是我面临一个我无法解决的大问题,并且在互联网上也找不到任何答案。当我在线程中的无限循环中没有立即输出到控制台时,似乎那个线程(在引擎类中)被程序杀死,只剩下 JFrame。但是当在无限循环中有一些输出到控制台时,线程(在引擎类中)完全按预期工作,这让我发疯:(
主类:
package ccarsimulator;
import javax.swing.SwingUtilities;
public class CCarSimulator {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
Window window = new Window("CCarsimulator");
});
}
}
窗口类:
package ccarsimulator;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Window extends JFrame{
Engine oEngine = new Engine(this);
JLabel LabelOutput = new JLabel();
JPanel PanelCanvas = new JPanel();
JLabel LabelSpeed;
JLabel LabelRPM;
JLabel LabelGearSet;
JLabel LabelTotalTime;
JLabel LabelFPS;
JLabel LabelCPS;
public Window(String WindowTitle){
super(WindowTitle);
this.addKeyListener(new KeyListener(){
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent oKey) {
System.out.println("Key Pressed");
oEngine.bKeyPressed[oKey.getKeyCode()] = true;
}
@Override
public void keyReleased(KeyEvent oKey) {
oEngine.bKeyPressed[oKey.getKeyCode()] = false;
}
});
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent oEvent){
System.out.println("Closing a Window");
oEngine.bStopEngine = true;
}
});
this.add(PanelCanvas);
PanelCanvas.add(LabelOutput);
LabelOutput.setText("Test");
this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setFocusable(true);
}
}
引擎类:
package ccarsimulator;
import java.awt.event.KeyEvent;
public class Engine extends Thread{
Thread thisSelf = this;
public boolean bStopEngine = false;
public Window oWindow;
public boolean []bKeyPressed = new boolean[KeyEvent.CHAR_UNDEFINED + 1];
public boolean []bKeyReleased = new boolean[KeyEvent.CHAR_UNDEFINED + 1];
public Engine(Window oWindow){
this.oWindow = oWindow;
thisSelf.start();
}
@Override
public void run(){
System.out.println("Waiting for window");
//while(!oWindow.isVisible() && !bStopEngine);
System.out.println("Engine is up and Running");
while(!bStopEngine){
//
//---------------------------------------
//Add some output to console to make this loop working...
//---------------------------------------
//
if(bKeyPressed[KeyEvent.VK_ESCAPE]){
System.out.println("Pressed Escape");
}
}
System.out.println("Engine was disabled");
}
}
在引擎的类线程无限循环中没有输出到控制台的结果是
Waiting for window
Engine is up and Running
Key Pressed
Key Pressed
Key Pressed
Key Pressed
Closing a Window
一些输出的结果是:
Waiting for window
Engine is up and Running
Some debug
Some debug
...
...
Some debug
Closing a Window
Some debug
Some debug
Engine was disabled
【问题讨论】:
-
各位,请不要投票给这个帖子,只是解释我做错了什么......或者解释为什么你不给这个帖子投票......因为这对你来说不公平
标签: java multithreading loops jframe infinite