gpt4 book ai didi

java - 停止和恢复键输入的无限循环

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:19 25 4
gpt4 key购买 nike

假设我们有一个无限循环,我们想让它 hibernate 一段时间,然后再恢复。我们没有设定时间,而是在按下一个键时恢复它。

例如,在 Java 中我们可以:

while(true){
doSomething();
}

现在,我们可以通过多种方式使其可中断。我们想在按键时中断它,所以我们将:

boolean running = true;
...
this.addKeyListener(this);
...
@override
public void keyPressed(KeyEvent e){
running = false;
}

然后运行一个方法(比方说run),其中包含:

while(running){
doSomething();
}

但随后我们会遇到一个问题:恢复。

所以我们采用 keyPressed 方法,并将其主体更改为:

running = !running;
if(running){
run();
}

这里只有一个问题:在 run 方法完成之前,KeyListener 不会做任何事情。我试过使用线程,我们将有:

private class Runner implements Runnable {
@Override
public void run() {
while (running) {
doSomething();
}
}
}

keyPressed 中:

if(running){
runner.wait();
}else{
runner.notify();
runner.run();
}
running = !running;

但在我的实际代码中,doSomething 方法是不能被中断的代码(因为它处理屏幕输出),所以 thread.wait() 可以永远不会被调用(它会一直抛出异常而不是真正等待)。

那么,总结一下:在 Java 中如何使用按键输入随意停止和恢复循环?

最佳答案

waitnotify 旨在从不同线程调用。顾名思义,wait 应在暂停并等待通知条件已更改的线程中调用:

private final Object keyPressMonitor = new Object();

private boolean running = true;

private Runnable gameLoop = new Runnable() {
@Override
public void run() {
try {
synchronized (keyPressMonitor) {
while (true) {
while (!running) {
keyPressMonitor.wait();
}
doSomething();
}
}
} catch (InterruptedException e) {
logger.log(Level.INFO,
"Interrupted; cleaning up and exiting.", e);
}
}
};

另一个线程,可能是调用 KeyListener(或由 ActionMap/InputMap 绑定(bind)调用的 Action)的 AWT 事件调度线程,将通知循环线程正确的键已被调用按下或释放:

public void keyPressed(KeyEvent event) {
if (event.getKeyCode() == theKeyICareAbout) {
synchronized (keyPressMonitor) {
running = true;
keyPressMonitor.notifyAll();
}
}
}

public void keyReleased(KeyEvent event) {
if (event.getKeyCode() == theKeyICareAbout) {
synchronized (keyPressMonitor) {
running = false;
keyPressMonitor.notifyAll();
}
}
}

关于java - 停止和恢复键输入的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27335654/

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