byłem bada impasu i zobaczyłem idąc zrzutu wątkuSunToolkit.awtLock: czy kod, który wykonuje taką blokadę musi być wywoływana EDT
at sun.awt.SunToolkit.awtLock(SunToolkit.java:229)
at sun.awt.X11.XRobotPeer.setup(Native Method)
- locked <0x00000000a633fbd0> (a java.lang.Class for sun.awt.X11.XRobotPeer)
at sun.awt.X11.XRobotPeer.<init>(XRobotPeer.java:24)
at sun.awt.X11.XToolkit.createRobot(XToolkit.java:683)
at java.awt.Robot.init(Robot.java:119)
at java.awt.Robot.<init>(Robot.java:77)
Spowodowane jest to przez wywołanie Robot robot = new Robot();
To połączenie ma blokadę (SunToolkit.awtLock
) i zastanawiałem się, kto jeszcze używa tej blokady, a jeśli byłoby lepiej, gdybym przeniósł to wywołanie new Robot()
do EDT. Nazwa sugeruje, że jest używany przez AWT, który jest pojedynczy wątek. Jeśli coś na EDT również bierze ten zamek (na przykład element Swing), szanse na trafienie w zakleszczenie zwiększają się, gdy tworzę z EDT.
Z drugiej strony, jak omówiono w artykule this question, wiele metod Robot
jest zaprojektowanych do zgłaszania wyjątku po wywołaniu w EDT. To sprawi, że będzie irytujące, jeśli najlepiej będzie utworzyć instancję Robot
w EDT. istnieje
Ten sam problem dla Toolkit.getDefaultToolkit().getScreenResolution()
więc nie ma potrzeby, aby skupić się wyłącznie na klasie Robot
:
at sun.awt.SunToolkit.awtLock(SunToolkit.java:229)
at sun.awt.X11.XToolkit.getScreenResolution(XToolkit.java:999)
Więc co staram się wyjaśnić:
- którzy są zainteresowani w tym zamek ?
- Czy ten zamek został wprowadzony tylko w celu wprowadzenia wielowątkowego Swing/AWT (lub co najmniej nieco bardziej wątkowego), ale czy zalecanym podejściem byłoby uniknięcie zabrania tego zamka na inny wątek, a następnie EDT?
- Czy jest dostępna oficjalna dokumentacja Oracle/Sun (coś w rodzaju Przewodnika na temat współbieżności w Swing), którą mogę skonsultować? Moje umiejętności Google zawiodły mnie w tej kwestii.
[EDT i awt.Robot ???, następnie proszę, aby zobaczyć pytanie] (http://stackoverflow.com/questions/10468432/do-robot-methods-need-to-be-run-on-the-event -queue) przez @Hovercraft Full Of Eels – mKorbel
Co to jest inny stos zakleszczeń? –
@GuillaumePolet Stos był dziwny. Na zamek czekały nici, ale nikt nie trzyma zamka. Zakładamy, że został spowodowany przez JOGL, który pozornie naraża to 'awtLock' i używa go. Ale impas jest ustalony w średnim czasie. Właśnie zastanawiałem się, co robi ten awtLock, jak stwierdzono w pytaniu – Robin