java-检测用户何时完成写入-循环中调用Thread.sleep()
作者:互联网
我想建立一个搜索,以在用户完成书写后向您显示结果.
如果必须在本地数据库中进行搜索,则每次用户释放密钥时都会触发搜索.
就我而言,我必须将Web请求发送到公开搜索功能的API点.该服务器每分钟仅允许来自单个IP的20个请求.
因此,我编写了一个线程来检测用户何时真正完成编写:
>(虽然为真)
>保存搜索框文字
>等待400毫秒
>检查搜索框文本是否与之前保存的文本相同
码:
private void checkIfUserFinishedWritingFunction() {
while(true) {
String previousText = textField.getText();
try {
Thread.sleep(400);
} catch (InterruptedException ex) {
return;
}
String actualText = textField.getText();
//WHEN USER FINISHED WRITING...
if(previousText.equals(actualText)) {
//IF SEARCHBOX ISN'T EMPTY
if(!textField.getText().trim().isEmpty()) {
//START A THREAD THAT SENDS WEB REQUEST
}
//IF SEARCHBOX IS EMPTY...
else {
//HIDE RESULTS POPUP
if(resultsList.isShowing())
resultsList.hide();
}
return;
}}}
NetBeans告诉我,在循环中调用Thread.sleep()可能很危险.我认为这是因为成本,在我的循环中每400ms运行一次.
如何解决此算法?
解决方法:
I think it’s because of the cost, and in my the loop runs every 400ms.
实际上,这是因为在基于GUI的应用程序中调用sleep时,很容易导致事件侦听器线程冻结.
(并且,如果这不在事件侦听器线程上,则调用hide可能是线程安全的隐患.)
更好的选择是使用事件侦听器的组合来更新文本框上的更新事件,该事件要注意自上次发送查询以来的时间,以及ScheduledExecutorService之类的东西.
标签:thread-sleep,multithreading,while-loop,search-box,java 来源: https://codeday.me/bug/20191119/2036618.html