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