thread problem current java multithreading while-loop thread-sleep search-box

current - thread sleep java problem



Detectar cuando el usuario terminó de escribir-Thread.sleep() llamado en loop (2)

Creo que es por el costo, y en mi el ciclo se ejecuta cada 400 ms.

En realidad, se debe a que cuando llama a suspensión en una aplicación basada en GUI, es probable que provoque la congelación del hilo del detector de eventos.

(Y si esto no está en el hilo del detector de eventos, entonces llamar a hide es probablemente un peligro para la seguridad de los hilos).

Una mejor alternativa sería utilizar una combinación de un detector de eventos para eventos de actualización en el cuadro de texto que presta atención a la hora desde la última consulta que envió, y algo así como un ScheduledExecutorService .

Quería crear una búsqueda que muestre los resultados cuando el usuario termine de escribir.

Si tuviera que buscar en una base de datos local, habría activado la búsqueda cada vez que el usuario liberara una clave.

En mi caso, tengo que enviar solicitudes web a un punto API que expone la función de búsqueda. El servidor solo permite 20 solicitudes por minuto desde una sola IP.

Entonces, escribí un hilo que detecta cuando el usuario realmente termina de escribir:

  • (mientras que es cierto)
  • guardar el texto del cuadro de búsqueda
  • espere 400ms
  • compruebe si el texto del cuadro de búsqueda es el mismo que el guardado antes

Código:

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 me dice que Thread.sleep () llamado en loop podría ser peligroso. Creo que es por el costo, y en mi el ciclo se ejecuta cada 400 ms.

¿Cómo puedo solucionar este algoritmo?


Llamar a Thread.sleep() no es costoso, pero la creación de un hilo podría ser.

Como regla general, si escribe código que llama a sleep() , entonces está (A) tratando de hacer algo que nadie había pensado antes, o (B) reinventando algo que podría haber tenido gratis, o (C) cometiendo un error.

Para la mayoría de nosotros, usualmente es (B) o (C) o ambos.

En este caso, en lugar de dedicar un hilo para sondear el estado de la GUI, puede realizar el sondeo desde el hilo de envío de evento (EDT) mediante un javax.swing.Timer . Consulte los tutoriales de Java para ver ejemplos: https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html