Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Thread.sleep()不工作。正在跳过的操作_Java_Multithreading_While Loop_Sleep - Fatal编程技术网

Java Thread.sleep()不工作。正在跳过的操作

Java Thread.sleep()不工作。正在跳过的操作,java,multithreading,while-loop,sleep,Java,Multithreading,While Loop,Sleep,这段代码应该搜索网页的html文件,将一些结果打印到窗口,睡眠60秒,然后重复搜索。这在python中工作得很好,但是翻译成java给我带来了问题。当我尝试执行这段代码时,它不再打印结果,而是无限期地休眠。如果没有while循环,事情看起来就像aspected一样 btnSearch.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {

这段代码应该搜索网页的html文件,将一些结果打印到窗口,睡眠60秒,然后重复搜索。这在python中工作得很好,但是翻译成java给我带来了问题。当我尝试执行这段代码时,它不再打印结果,而是无限期地休眠。如果没有while循环,事情看起来就像aspected一样

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");
我希望输出是“搜索…”暂停“完成搜索”,但事实并非如此。它只输出“完成搜索”


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

在我看来,你好像置身于这个世界之中。如果是这种情况,您的
sleep()
s将运行良好-您的
exportField
上的重新绘制永远不会(在while的情况下)或延迟(在简单睡眠的情况下)发生

你应该考虑一下这种长时间运行但UI改变的调用类型。

简化的方法是启动一个线程并通过以下方式更新UI:


在我看来,你好像是在这个世界里。如果是这种情况,您的
sleep()
s将运行良好-您的
exportField
上的重新绘制永远不会(在while的情况下)或延迟(在简单睡眠的情况下)发生

你应该考虑一下这种长时间运行但UI改变的调用类型。

简化的方法是启动一个线程并通过以下方式更新UI:


据我所知,您正在actionPerformed方法内启动一个无限循环(假设running没有在某个地方设置为false),这将阻止事件分派线程上的所有事件。看看秋千。像@Jan said这样的长时间运行的事件应该由SwingWorker或在一个单独的线程上完成,至少

据我所知,您正在actionPerformed方法内部启动一个无限循环(假设运行在某个地方没有设置为false),这将阻止事件分派线程上的所有事件。看看秋千。像@Jan said这样的长时间运行的活动应该由SwingWorker或至少在单独的线程上完成

谢谢@Jan。这似乎是朝着正确方向迈出的一步!我对线程一无所知,但这段代码和这些链接应该会有很大帮助。一旦你对答案感到满意,如果你接受它就太好了。祝你的项目好运。谢谢@Jan。这似乎是朝着正确方向迈出的一步!我对线程一无所知,但这段代码和这些链接应该会有很大帮助。一旦你对答案感到满意,如果你接受它就太好了。祝您的项目好运。感谢您提供@dbrown93链接,至少可以从这个bug开始!感谢您提供的链接@dbrown93至少可以从这个bug开始!
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();              
        }
    });