El bucle ocupado en otro subproceso retrasa el procesamiento EDT

Tengo un programa Java que ejecuta un bucle cerrado en un hilo separado (no EDT). Aunque creo que la interfaz de usuario de Swing debería responder, no lo es. El siguiente programa de ejemplo muestra el problema: al hacer clic en el botón "Probarme", debería aparecer un cuadro de diálogo más o menos medio segundo después, y debería ser posible cerrar ese cuadro de diálogo inmediatamente haciendo clic en cualquiera de sus respuestas. En cambio, el diálogo tarda mucho más en aparecer y / o tarda mucho tiempo en cerrarse después de hacer clic en uno de los botones.

El problema ocurre en Linux (dos máquinas diferentes con diferentes distribuciones), en Windows, en la Raspberry Pi (servidor VM solamente) y en Mac OS X (informado por otro usuario de SO).Java versión 1.8.0_65 y 1.8.0_72 (probé ambas)Procesador i7 con muchos núcleos. El EDT debe tener suficiente potencia de procesamiento disponible.

¿Alguien tiene alguna idea de por qué el procesamiento EDT se está demorando, a pesar de que solo hay un hilo ocupado?

(Tenga en cuenta que a pesar de varias sugerencias de laThread.sleep llamada es la causa del problema, no lo es. Se puede eliminar y el problema aún se puede reproducir, aunque se manifiesta con un poco menos de frecuencia y generalmente presenta el segundo comportamiento descrito anteriormente, es decir, no respondeJOptionPane diálogo en lugar de retraso en la aparición del diálogo. Además, no hay ninguna razón por la que la llamada de suspensión deba ceder al otro hilo porquehay núcleos de procesador de repuesto como se ha mencionado más arriba; el EDT podría continuar ejecutándose en otro núcleo después de la llamada asleep)

import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class MFrame extends JFrame
{
    public static void main(String[] args)
    {
        EventQueue.invokeLater(() -> {
            new MFrame();
        });
    }

    public MFrame()
    {
        JButton tryme = new JButton("Try me!");

        tryme.addActionListener((e) -> {
            Thread t = new Thread(() -> {
                int a = 4;
                for (int i = 0; i < 100000; i++) {
                    for (int j = 0; j < 100000; j++) {
                        a *= (i + j);
                        a += 7;
                    }
                }
                System.out.println("a = " + a);
            });

            t.start();

            // Sleep to give the other thread a chance to get going.
            // (Included because it provokes the problem more reliably,
            // but not necessary; issue still occurs without sleep call).
            try {
                Thread.sleep(500);
            }
            catch (InterruptedException ie) {
                ie.printStackTrace();
            }

            // Now display a dialog
            JOptionPane.showConfirmDialog(null, "You should see this immediately");
        });

        getContentPane().add(tryme);

        pack();
        setVisible(true);
    }
}

Actualizar: El problema ocurre solo con la máquina virtual del servidor (pero ver más actualizaciones) Especificar la máquina virtual del cliente (-client El argumento de la línea de comando para el ejecutable de Java) parece suprimir el problema (actualización 2) en una máquina pero no en otra.

Actualización 3: Veo un 200% de uso del procesador por el proceso de Java después de hacer clic en el botón, lo que implica que hay 2 núcleos de procesador completamente cargados. Esto no tiene sentido para mí en absoluto.

Actualización 4: También ocurre en Windows.

Actualización 5: Usar un depurador (Eclipse) resulta problemático; el depurador parece incapaz de detener los hilos. Esto es muy inusual, y sospecho que hay algún tipo de livelock o condición de carrera en la VM, por lo que he presentado un error con Oracle (ID de revisión JI-9029194).

Actualización 6: encontrémi informe de errores en la base de datos de errores de OpenJDK. (No me informaron que había sido aceptado, tuve que buscarlo). La discusión allí es muy interesante y ya arroja algo de luz sobre cuál puede ser la causa de este problema.

Respuestas a la pregunta(2)

Su respuesta a la pregunta