Análisis del problema de bloqueo multiproceso de Java Swing
Al desarrollar interfaces gráficas basadas en Java Swing, a menudo encontramos problemas de subprocesos múltiples en Swing. Podemos pensar en ello si necesitamos mostrar muchos datos en una interfaz gráfica. Estos datos requieren mucho tiempo y complejidad. consultas Si el trabajo de consulta y cálculo se realiza en el mismo hilo de la interfaz gráfica, la interfaz estará en estado de bloqueo durante un período de tiempo, lo que traerá una mala experiencia interactiva al usuario para resolver este problema. , generalmente se inicia un hilo separado para el cálculo y el cálculo. Consulta el trabajo y actualiza la interfaz gráfica en cualquier momento. En este momento, puede que no solo no resuelva el problema original de fallas ocasionales, sino que también cause que el programa se bloquee. Afortunadamente, hay una tecla de acceso directo para interrumpir el programa oculta en el JDK, que es CTRL+BREAK. Sun no ha anunciado en la documentación que si inicia un programa Java en modo de línea de comando y presiona CTRL+BREAK. obtendrá información de seguimiento de la pila a partir de esta información de seguimiento, podrá conocer la ubicación específica que causó el bloqueo.
Cuando un programa se bloquea, definitivamente querrá encontrar la causa y resolverla lo antes posible. En este momento, su energía general se gastará en encontrar la ubicación que causó el punto muerto. La otra mitad de su energía se usará para rastrear la pila para determinar la ubicación que causó el punto muerto. El programa Java Swing puede no tener ningún valor. Esto se debe a que Java tiene un requisito especial para la programación multiproceso de Swing, que es que en Swing, los componentes GUI solo se pueden modificar en el mismo hilo que Swing. es decir, si desea ejecutar código similar a jLabel setText (blabla), debe estar en el hilo Swing y no estar permitido en otros hilos. Si debe modificar el componente en otros hilos, puede usar un método similar para resolverlo. it
SwingUtilities invokeLater(new Runnable() {
public void run() {
jLabel setText( blabla );
}
}
Aunque el método invokeLater tiene el significado de ejecución retardada, de hecho casi no tiene impacto y puede ejecutarse en unos pocos milisegundos. También existe un método invokeAndWait. A menos que haya una necesidad especial, casi no se usa.
Es comprensible que cause problemas de actualización sin usar invokeLater, pero las ventajas de causar un punto muerto son increíbles. No es necesario llamar al método en ningún momento. Esto se debe a que en la mayoría de los casos actualizamos la interfaz en el mismo hilo que Swing. Por ejemplo, el método ActionListener actionPerformed que escucha eventos de clic en botones se ejecuta en el mismo hilo que Swing. Pero si se hace referencia a otra clase en la clase de devolución de llamada y si no pertenece a AWT/Swing, el resultado es difícil de determinar, por lo que usar invokeLater debería ser el más seguro
Cabe señalar que cualquier cosa hecha en invokeLater hará que el trabajo de dibujo de la ventana del hilo Swing se detenga. Espere a que finalice el trabajo de invokeLater, así que no realice operaciones que requieran mucho tiempo en invokeLater. Intente realizar solo el trabajo relacionado con el dibujo de la interfaz. actualizaciones mediante refactorización de código lishixinzhi/Article/program/Java/gj/201311/ 27498