gpt4 book ai didi

当我单击调用线程 wait() 的停止按钮时,Java GUI 停止响应

转载 作者:行者123 更新时间:2023-11-30 06:32:36 26 4
gpt4 key购买 nike

当我单击 GUI 上的停止按钮(通过事件监听器调用下面的代码)时,GUI 停止响应。我知道 wait() 必须同步,但是调用它的正确方法是什么?提前致谢!

public void actionPerformed(ActionEvent actionEvent) {
if(actionEvent.getSource().equals(ui.stop)) {
if(clickerThread != null) {

/*terminate() stops the while loop
running in the thread's run(); */
autoClicker.terminate();

synchronized(clickerThread) {
try {
clickerThread.wait();
ui.updateLabel("Idle", ui.state);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

这就是线程的创建方式,以防有帮助:

else if(actionEvent.getSource().equals(ui.play)) {
if(clickerThread == null) {
autoClicker= new AutoClicker();
clickerThread = new Thread(autoClicker);
clickerThread.start();
ui.updateLabel("playing", ui.state);
}
}

最佳答案

正如您所发现的,调用 wait() 不会卡住调用它的线程(事实上,它可以在任何“监视器”对象上调用 - 线程与否),而是被称为in的线程。根据 Object API (并且一定要养成在询问之前阅读 API 的习惯):

Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.

最好为您的 clickerThread 类提供一个 GUI 可以调用的公共(public)方法来暂停和恢复执行。因此,也许您希望为 ClickerThread 类提供一个 volitile boolean 字段,在决定是否继续运行时检查该字段,然后为该类提供一个公共(public)方法来设置该字段的值。

关于当我单击调用线程 wait() 的停止按钮时,Java GUI 停止响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45774702/

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