On Wed, 6 Jan 2021 08:24:04 GMT, K Suman Rajkumaar 
<github.com+70650887+skoda...@openjdk.org> wrote:

>> test/jdk/javax/swing/JMenuItem/8031573/bug8031573.java line 68:
>> 
>>> 66: 
>>> 67:         if (!latch.await(5, TimeUnit.MINUTES)) {
>>> 68:             frame.dispose();
>> 
>> The `dispose()` method should be called on EDT.
>
> If I remove the frame.dispose(), the frame doesn't gets disposed even after 
> timeout.

You're right, in my previous comment I forgot about timeout.
Yet it should still be called on EDT.

However, to clean up the code a bit, I propose calling `dispose()` in finally 
block. Thus there'll be only one place where frame is disposed of instead of 
being scattered in multiple event handlers:
try {
    // Create GUI
    // Check conditions and throw exceptions on failure
} finally {
    SwingUtilities.invokeAndWait(() -> {
        if (frame != null) {
            frame.dispose();
        }
    }
}
In this case, frame will be accessed from one thread only, EDT, and does not 
need to be volatile.

Since the frame is always disposed of, other calls to `frame.dispose()` can be 
removed.

-------------

PR: https://git.openjdk.java.net/jdk/pull/1878

Reply via email to