我读过一些关于同步方法的文章(包括甲骨文),
我有以下代码:
public class Player extends javax.swing.JLabel implements Runnable{
private static int off2[] = {-1, 0, 1, 0}, off1[] = {0, 1, 0, -1};
private static final Map dir = new java.util.HashMap<Integer, Integer>();
static{
dir.put(KeyEvent.VK_UP, 0);
dir.put(KeyEvent.VK_RIGHT, 1);
dir.put(KeyEvent.VK_DOWN, 2);
dir.put(KeyEvent.VK_LEFT, 3);
}
private boolean moving[] = new boolean[4];
@Override
public void run(){
while(true){
for(Object i : dir.values()){
if(isPressed((Integer)i)) setLocation(getX() + off1[(Integer)i], getY() + off2[(Integer)i]);
}
try{
Thread.sleep(10);
}catch(java.lang.InterruptedException e){
System.err.println("Interrupted Exception: " + e.getMessage());
}
}
}
public void start(){
(new Thread(this)).start();
}
private synchronized boolean isPressed(Integer i){
if(moving[i]) return true;
else return false;
}
public synchronized void setPressed(KeyEvent evt) {
if(dir.containsKey(evt.getKeyCode()))moving[(Integer)dir.get(evt.getKeyCode())] = true;
}
public synchronized void setReleased(KeyEvent evt){
if(dir.containsKey(evt.getKeyCode()))moving[(Integer)dir.get(evt.getKeyCode())] = false;
}
}
现在它只是运动而已。我的理解是,装配和放放的数据集是从主线上调用的,而我的主要窗体的按键收听器记录了按键的按键和放行事件。这个代码合理吗?它是同步关键字的正确使用吗? (代码没有它就能工作,但我猜它最好有它? )