Ich habe einen Deadlock untersucht und Folgendes im Thread Dump gesehen:
%Vor% Dies wird verursacht, indem Robot robot = new Robot();
Dieser Aufruf nimmt eine Sperre ( SunToolkit.awtLock
) und ich fragte mich, wer diese Sperre sonst noch benutzt, und ob es besser wäre, wenn ich diesen new Robot()
-Aufruf an die EDT verschieben würde. Der Name deutet darauf hin, dass es von AWT verwendet wird, das single-threaded ist. Wenn auch etwas im EDT diese Sperre übernimmt (z. B. eine Swing-Komponente), erhöhen sich meine Chancen auf einen Deadlock, wenn ich Robot
vom EDT erzeuge.
Auf der anderen Seite, wie in diese Frage besprochen, sind viele der Methoden Robot
entworfen, um zu werfen eine Ausnahme, wenn der EDT aufgerufen wird. Dies würde es ärgerlich machen, wenn es am besten wäre, die Robot
Instanz auf dem EDT zu erstellen.
Dasselbe Problem existiert für Toolkit.getDefaultToolkit().getScreenResolution()
, also muss man sich nicht nur auf die Klasse Robot
konzentrieren:
Also was ich versuche zu klären: