gpt4 book ai didi

java - 如何中断一个无限运行的线程来执行一些有限的方法?

转载 作者:行者123 更新时间:2023-11-30 10:01:02 25 4
gpt4 key购买 nike

我有一个机器人,它在启动时会执行以下操作:

    boolean botPaused = false;
JButton startButton = new JButton("Start/Resume");
startButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
SwingUtilities.invokeLater(() -> {
botPaused = false;
while (!botPaused) { // infinitely keeps doing this...
advertisementBot.advertise();
}
});
}
});

我想在这里通过更改 botPaused boolean 变量来实现暂停和恢复功能。我试过这个:

    JButton pauseButton = new JButton("Pause");
pauseButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
SwingUtilities.invokeLater(() -> botPaused = true);
}
});
panel.add(pauseButton);

但它没有暂停,我认为这是因为当我按下暂停按钮时,暂停 Action 被添加到事件线程中,但由于原始 Action 从未完成,我们永远不会到达暂停 Action 。

如何解决?

最佳答案

问题是您在 Swing 事件分派(dispatch)线程 (EDT) 中运行机器人,因此它会阻止所有其他操作。

您应该在单独的线程中运行它。只有 GUI 上的机器人操作应该在 EDT 中完成。

类似于:

boolean botPaused = false;
JButton startButton = new JButton("Start/Resume");
startButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Thread botThread = new Thread() {
public void run() {
while (true) { // infinitely keeps doing this...
// do things unrelated to GUI, long tasks, etc
SwingUtilities.invokeLater(() -> {
// do GUI related task. (display messages, etc.)
});
// do other things unrelated to GUI, long tasks, etc
}
}
};
botThread.start();
}
});

这是不处理暂停/恢复方面的快速脏代码。我让你弄清楚这部分。还有其他一些相关的帖子(例如:How to Pause and Resume a Thread in Java from another Thread)

提醒一下:EDT 应该只用于操纵 Swing 组件。长时间/耗时的任务应该在 EDT 之外运行。

关于java - 如何中断一个无限运行的线程来执行一些有限的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57670959/

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