gpt4 book ai didi

java - boolean 值无法正确更新,除非您打印它

转载 作者:行者123 更新时间:2023-12-01 06:45:02 24 4
gpt4 key购买 nike

所以我正在制作这个java小程序,我只想首先确保按键输入正常工作,然后再使其变得更复杂。我不知道为什么,但是当你删除“System.out.print(needUpdating);”时它没有根据按键输入正确移动矩形。谁能告诉我为什么以及如何解决它?这对我来说完全是个谜。

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JApplet;

public class firstApplet extends JApplet implements KeyListener, Runnable {
final int MOVEAMOUNT = 1;
boolean needUpdating;
int x,y,dx,dy;
Thread runner = null;

public void init() {
this.setFocusable(true);
needUpdating = false;
this.requestFocusInWindow();
x=0;
y=0;
dx=0;
dy=0;
addKeyListener(this);
}

public void stop() {
}

public void start() {
runner = new Thread(this);
runner.start();
}

public void paint(Graphics g) {
System.out.println("x= "+x+" y = "+y);
g.drawRect( x, y, 100, 15 );
}

@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if(key==KeyEvent.VK_UP) {
System.out.println("up");
dy=MOVEAMOUNT;
}
else if (key==KeyEvent.VK_DOWN) {
dy=-MOVEAMOUNT;
}
else if (key==KeyEvent.VK_LEFT) {
dx=-MOVEAMOUNT;
}
else if (key==KeyEvent.VK_RIGHT) {
dx=MOVEAMOUNT;
}
// TODO Auto-generated method stub
needUpdating = true;
System.out.println("needUpdating listening = " +needUpdating);
}

@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
dx=0;
dy=0;
}

@Override
public void keyTyped(KeyEvent e) {
}

public void processMovement() {
System.out.println("processing");
x+=dx;
y+=dy;
}

@Override
public void run() {
this.addKeyListener(this);
while(true) {
System.out.print(needUpdating);
if(needUpdating) {
processMovement();
repaint();
needUpdating=false;
}
}
}
}

最佳答案

您的代码未正确同步。更好地说,它根本不同步。然而,System.out.println 是一个同步方法,在当今典型的 CPU 架构上,进入同步块(synchronized block)恰好是在 native 代码级别实现为内存屏障 。这具有使 boolean 值的更改对其他线程可见的效果。

结论:正确同步你的代码,“神奇”的行为就会消失。

关于java - boolean 值无法正确更新,除非您打印它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17427176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com