Thread.sleep() 不工作。被跳过的操作

Thread.sleep() not working. Operations being skipped

这段代码应该搜索网页的 html 文件,将一些结果打印到 window,休眠 60 秒然后再次重复搜索。这在 python 中工作得很好,但转换为 java 给我带来了问题。当我尝试执行这段代码时,它不再打印结果,而是无限期地休眠。没有 while 循环,事情似乎按方面工作。

btnSearch.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            running = true;

            while (running) {

                exportField.setText("Searching...");


                try {

                    exportField.setText(crawler.fetchHtml(url););



                } catch (Exception e) {
                    exportField.setText("invalid parameters.");
                    e.printStackTrace();
                }


                try {
                    Thread.sleep(60000);
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }


            }

        }
    });

更奇怪的是,如果我尝试像这样简单的事情:

exportField.setText("Searching...");

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {              
    e.printStackTrace();
}

exportField.setText("Done Searching");

我希望输出为 "searching..." pause "done Searching" 但事实并非如此。它只是输出 "done searching."

做这个项目是为了好玩!任何帮助将不胜感激。

在我看来你在 Event Dispatch Thread 里面。如果是这样的话,你的 sleep()s 会运行得很好 - 你的 exportField 上的重绘永远不会(在 while 的情况下)或延迟(在简单睡眠的情况下)发生。

您应该考虑研究 SwingWorker 以了解这种长期 运行 但 UI 变化的调用类型。

一种简化的方法是启动一个线程并通过 SwingUtilities.invokeLater():

更新 UI
btnSearch.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            new Thread("Fetcher") {

                boolean running = true;

                public void run() {
                    running = true;

                    while (running) {
                        SwingUtilities.invokeLater(() -> exportField.setText("Searching..."));
                        try {
                            exportField.setText(crawler.fetchHtml(url));
                        } catch (Exception e) {
                            SwingUtilities.invokeLater(() -> exportField.setText("invalid parameters."));
                            e.printStackTrace();
                        }
                        try {
                            Thread.sleep(60000);
                        } catch (InterruptedException e) {

                            e.printStackTrace();
                        }
                    }
                }
            }.start();              
        }
    });

据我所知,您正在 actionPerformed 方法内开始无限循环(假设 运行 未在某处设置为 false),这将阻止事件分派线程上的所有事件。看看 this tutorial 的 swing。像@Jan 所说的长 运行 事件至少应该用 SwingWorker 或在单独的线程上完成