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内吗?这不是一个耗时的步骤,你可以在声明后立即进行。我更新了我的答案。