Java 如何中断一个无限运行的线程来执行一些有限方法?
我有一个机器人,启动时会执行以下操作:Java 如何中断一个无限运行的线程来执行一些有限方法?,java,swing,Java,Swing,我有一个机器人,启动时会执行以下操作: boolean botPaused = false; JButton startButton = new JButton("Start/Resume"); startButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { SwingUti
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布尔变量来实现暂停和恢复功能。我试过这个:
JButton pauseButton = new JButton("Pause");
pauseButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
SwingUtilities.invokeLater(() -> botPaused = true);
}
});
panel.add(pauseButton);
但是它没有暂停,我想这是因为当我按下暂停按钮时,暂停动作被添加到事件线程中,但是由于原始动作从未完成,我们从未达到暂停动作
如何解决这个问题?问题是您在Swing事件调度线程(EDT)中运行bot,因此它会阻止所有其他操作 您应该在单独的线程中运行它。只有GUI上的bot操作应该在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();
}
});
这是一个不处理暂停/恢复方面的快速脏代码。我让你想想这部分。还有一些其他相关的职位(例如:)
提醒:EDT只能用于操纵回转组件。长时间消耗任务应在EDT之外运行。不相关,但暂停按钮将循环条件设置为false。resume按钮将te条件设置回true,但循环已中断,因此无法重新开始。要更快获得更好的帮助,请添加or。Correct@jhamon,感谢您指出这一点,修复了代码。但这仍然不能解决问题……如果需要进行长时间运行的后台工作,也可以使用SwingWorker:那么我应该在哪里调用botThread的run方法?它会在EDT内吗?这不是一个耗时的步骤,你可以在声明后立即进行。我更新了我的答案。