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 或在单独的线程上完成
这段代码应该搜索网页的 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()
:
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 或在单独的线程上完成