Java SWT GUI no responde a las actualizaciones durante el proceso en segundo plano de larga ejecución

Tecnologías utilizadas: Java 1.6 SWT GUI

Problema: las actualizaciones de información de la GUI finalmente se bloquean (la GUI deja de responder por completo) después de aproximadamente 60 minutos de ejecución de una tarea en segundo plano.

El problema parece estar en las actualizaciones de la GUI, y no puedo encontrar la manera de remediar esta situación (revisé las opciones de concurrencia de Java, etc.). El hilo de optimización actualiza periódicamente el cuadro de texto en la GUI con la información de procesamiento. Durante mis pruebas, esta "actualización" se retrasa SIGNIFICATIVAMENTE detrás de la salida de la consola y la salida de la base de datos; por eso, suponga que la optimización realiza 4000 pasos de optimización. La consola puede informar que está trabajando en el paso de optimización 1900 (confirmado en la base de datos), pero la GUI aún genera información del paso 700.

Información general: estoy ejecutando una tarea de optimización de aprendizaje automático e incorporo la tarea en una interfaz gráfica de usuario de SWT. La tarea puede tardar una hora o más en completarse, según los parámetros. Diseñé la tarea de optimización como un hilo separado. La GUI permite al usuario presionar un botón para iniciar la optimización. La GUI incluye (para simplificar) 1) una tabla de tareas y 2) un cuadro de texto SWT para comentarios durante la optimización. La tabla de tareas se actualiza a medida que se completa cada grupo de tareas distinto. El cuadro de texto SWT genera comentarios más regulares / frecuentes (al igual que System.outPERO usando subprocesos para actualizar el cuadro de texto a través del hilo EDI GUI). Es decir, creo que estoy usando al menos tres hilos: 1) el hilo GUI, 2) el aSynchilo para las actualizaciones GUI (SWT), y 3) un hilo de fondo para la optimización en sí.(Menciono esto porque los tutoriales de concurrencia de Java dirigen expresamente que las tareas de ejecución prolongada deben ejecutarse en su propio hilo para evitar el punto muerto y el hambre de la GUI. Sin embargo, aunque creo que hice esto, la GUI todavía se detiene después de una larga ejecución de optimización, y esto es lo que estoy tratando de solucionar. Debido a que las ejecuciones de optimización tardan tanto en completarse, el bloqueo de la GUI es un problema importante: perder más de una hora antes de darse cuenta de que la GUI se detuvo).

Estructura básica del programa: Clase GUI -> lanza un hilo separado para la Clase de optimización

Optimization Class puede actualizar los componentes de la clase GUI (usando SWT asyncExec) a través de devoluciones de llamadas

Confirmado: puedo confirmar que el subproceso en segundo plano se ejecuta completamente: 1) el subproceso en segundo plano actualiza varias tablas de la base de datos y todas las tablas se actualizan por completo; 2) la System.outsalida directamente de la tarea de optimización enviada a la consola en Eclipse muestra que el hilo de optimización se ejecuta completa y completamente.

Además, durante las pruebas, si reduzco el conjunto de optimización a quizás 400 pasos, la GUI parece funcionar bien.

Código relevante: CLASE GUI-- Código para actualizar la GUI y en la Clase GUI (el hilo de la clase de optimización lo llama) -

public void setFeedback(final String workerthreadinfo, final boolean append) {
try{  
    Display.getDefault().asyncExec(new Runnable(){  
    public void run(){  
        if(!textfeedback.isDisposed() && textfeedback !=null){  
        if (append) {
                      textfeedback.setText(workerthreadinfo + "\n" +
                            textfeedback.getText()) ;
        } else {
            textfeedback.setText(workerthreadinfo) ;
        }  
         } 
    }  
    });
     } .....

Creación de instancias del subproceso de optimización de trabajo en la clase GUI

private OptimizerWorkerThread workerthread = 
   new OptimizerWorkerThread(this) ;

Código en la clase GUI Lanzamiento de la clase de optimización (como hilo)

protected void optimize() {
    workerthread.go() ;
}

CLASE DE OPTIMIZACIÓN: Método de subproceso de optimización que se "vincula" a la GUI (guiwindow = clase de GUI anterior)

// ==================================================================
// GUI Update Methods
// ================================================================== 
public void updateFeedBackInfo(String update, boolean append) {
    guiwindow.setFeedback(update, append) ;
}

Ejemplo de devolución de llamada a GUI desde el hilo de optimización

//GUI Feedback
this.updateFeedBackInfo("Saving optimization run record to database ... ", 
   APPENDTEXT ) ; // APPENDTEXT = boolean TRUE instructing GUI textbox to append
Respuesta 1

Esto no suena tanto como un problema de subprocesos.

Si corrieras por accidente en el hilo de la GUI, la GUI estaría muerta justo después de hacer clic en el botón. Así que creo que podemos descartar eso.

Lo que describe parece más un problema de carga de memoria / rendimiento. Recomiendo encarecidamente conectar Visualvm con su aplicación y busque especialmente aumentar constantemente el consumo de memoria. Además, usar el generador de perfiles incluido en visualvm podría indicar cosas que consumen mucha CPU o memoria.

Respuesta: 2

Posible duplicado: ¿recuperar la configuración regional del navegador de httpsession? ¿Cómo podemos obtener el formato de fecha utilizado por el sistema cliente en una aplicación web? ¿Puedo usar javascript o se puede hacer algo con el código java?

Estoy tratando de incorporar Java KeyListener a mi objeto en movimiento con las flechas izquierda / derecha que afectan las coordenadas del eje x (xSpeed) y las flechas arriba / abajo que afectan el eje y (ySpeed). Simplemente no estoy ...

Utilizando aplicaciones web Java (JSP / Servlets, sin EJB), ¿cuál es el mejor enfoque para autenticar a un usuario y autorizar sus acciones, sin utilizar HttpSession? NB La razón de esto ...

Cuando se intenta abrir una sesión de Hibernate, la parte del código que inicializa la nueva configuración de Hibernate se rompe con la excepción "Service jboss-as tiene una dependencia circular". Llamando ...