2017-05-17 4 views
2

Ich überarbeite gerade eine Anwendung, die ich threadsicher gemacht habe.Ist JCheckBox.isSelected() threadsicher?

Ich habe eine JCheckBox, die ich überprüfen muss. Diese JCheckBox wird im gesamten Programm in verschiedenen Threads referenziert.

Kann ich einfach anrufen checkbox.isSelected() oder muss ich diesen Anruf mit invokeLater machen?

Ich finde es schwierig, Nebenläufigkeit im Allgemeinen zu verstehen, aber ich komme langsam, aber sicher. Wenn das eine dumme Frage ist, sag mir bitte, warum ich mein Verständnis besser verstehe.

Vielen Dank.

+0

Ich bin nicht ganz sicher, aber wenn man bedenkt isSelected() sollte lediglich einen Wert zurückgeben, ohne das Kontrollkästchen zu ändern, sollten Sie sein gut ohne die Verwendung von invokeLater. –

+0

gerade gegeben [diese Antwort] (http://Stackoverflow.com/a/1796687/1799530), würde ich sagen nein – SomeJavaGuy

+0

Rufen Sie 'isSelected()' außerhalb der 'EDT'? Wenn Sie beispielsweise eine Verarbeitung in einem Aktionslistener durchführen, gibt es kein Problem. Wenn Sie 'isSelected()' aus normalem Code aufrufen, dann würde ich sagen, dass das eher ein Design-Problem ist und 'invokeLater()' wäre keine sehr geeignete Methode, um es trotzdem zu beheben. – Kayaman

Antwort

1

Nein, es ist nicht threadsicher. Swing ist generell nicht threadsicher. Sie müssen invokeLater verwenden. Auf der anderen Seite können Sie den aktuellen Thread warten, bis die Aufgabe in invokeLater Ausführungen machen:

private boolean isSelected(final AbstractButton button) { 
    if (SwingUtilities.isEventDispatchThread()) { 
     // a shortcut so the AWT thread won't wait for itself 
     return button.isSelected(); 
    } 
    final AtomicBoolean isSelected = new AtomicBoolean(); 
    final CountDownLatch latch = new CountDownLatch(1); 
    SwingUtilities.invokeLater(() -> { 
     try { 
      isSelected.set(button.isSelected()); 
     } finally { 
      latch.countDown(); 
     } 
    }); 
    try { 
     latch.await(); 
    } catch (InterruptedException e) { 
     throw new RuntimeException(e); 
    } 
    return isSelected.get(); 
}