编程语言
首页 > 编程语言> > java-检测用户何时完成写入-循环中调用Thread.sleep()

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