keyListener和线程无法正常工作

时间:2014-10-31 22:31:00

标签: java multithreading applet

嘿我试图打开控制台"持有"什么时候拿钥匙。我正在使用小程序 因为这段代码是测试applet中的密钥保存。如果有任何具有良好java知识的人可以向我解释发生什么事情将非常感激。

我很确定问题可能与线程有关。

public class appletkeytest extends Applet implements KeyListener, Runnable {

    boolean held;

    public void init(){
        addKeyListener(this);
        Thread t = new Thread( this );
        t.start();
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) {
        held = true;
        System.out.println(held);
    }

    public void keyReleased(KeyEvent e) {   
        held = false;
        System.out.println(held);
    }

    public void run() {
        System.out.println(held);

        while(held){
            System.out.println("holding");
        }   
    }
}

1 个答案:

答案 0 :(得分:1)

首先,我建议将held定义为易失性。

其次,既然您从init()方法启动线程,它将在您按下该键之前开始运行,从而立即完成。

我会像这样离开init

public void init() {
    addKeyListener(this);
}

keyPressed侦听器更改为:

public void keyPressed(KeyEvent e) {
    boolean wasHeld = held;
    held = true;
    System.out.println(held);
    if ( !wasHeld) {
        Thread t = new Thread(this);
        t.start();
    }
}

wasHeld变量背后的原因是,当您按住某个键时,它实际上会发送多个keyPressed个事件,直到它被释放。如果您刚为每个创建了一个线程,那么在一次按键操作期间会创建很多线程,所有这些线程都忙于写入您的控制台。

因此,只有在第一次为此特定按键发送keyPressed事件时才想创建线程。在释放前一个键后再按一个键时,将创建一个新线程。