#netbeans #deadlock #gui-builder
#netbeans #тупиковая ситуация #графический интерфейс-конструктор
Вопрос:
Я уже обращался к сообществу NetBeans по сообщению об ошибках, прежде чем кто-либо укажет мне туда. У них нет решения.
В каждой используемой мной среде IDE NetBeans (у меня есть 4 версии (6.9, 6.9.1, 7.0 и последняя экспериментальная сборка) на нескольких компьютерах) они последовательно и предсказуемо переходят в тупик всякий раз, когда я открываю GUI builder для класса (JFrame, JDialog и Panel), если только это не первый раз, когда был открыт GUI builder класса. Кто-нибудь еще сталкивался с этой проблемой? Если да, нашли ли вы способ это исправить?
Причина
Я обнаружил причину, но до сих пор не нашел решения: в BHFrame
методе initComponents()
класса моей библиотеки запущен новый поток, который расширяется JFrame
и использует NetBeans GUI Builder. NetBeans пытается запустить этот метод при попытке создать графический интерфейс в конструкторе и блокируется в бесконечном цикле ожидания. NetBeans сообщает об этом во время сброса потока:
Found one Java-level deadlock:
=============================
"BHFrame.initComponents(): Setting up custColorsEditDialog":
waiting to lock monitor 0x089178d4 (object 0x1ae148f8, a
javax.swing.MultiUIDefaults),
which is held by "AWT-EventQueue-1"
"AWT-EventQueue-1":
waiting to lock monitor 0x0868f6ec (object 0x1a310f18, a
java.awt.Component$AWTTreeLock),
which is held by "BHFrame.initComponents(): Setting up custColorsEditDialog"
Комментарии:
1. она когда-нибудь выходит из тупика? Я знаю, вы сказали, что уже просмотрели список ошибок NB, но посмотрите, поможет ли вам этот отчет об ошибке
2. Этого не происходит, отсюда и термин «Взаимоблокировка». Однажды я даже оставил ее запущенной на полтора дня. Она все еще была заморожена. — Кроме того, посмотрите на электронную почту пользователя, который отправил ее. Это я.
3. Итак, позвольте мне прояснить, конструктор графического интерфейса вызывает ваш библиотечный класс, который порождает поток и вызывает конструктор графического интерфейса? Я не очень удивлен, что это приводит к взаимоблокировке, если это так.
4. Похоже, что при запуске GUI builder он просматривает
initComponents()
метод моегоBHFrame
класса и пытается его запустить. В рамках этого метода появляется новый поток (с именемBHFrame.initComponents(): Setting up custColorsEditDialog
), и он сообщает потокуAWT-EventQueue-1
дождаться завершенияBHFrame.initComponents(): Setting up custColorsEditDialog
потока, который, в свою очередь, ожидает завершенияAWT-EventQueue-1
потока, и они застревают в взаимоблокировке. NetBeans не будет отвечать, пока оба потока не завершатся и не приведут к взаимоблокировке.
Ответ №1:
Я удалил новый поток, созданный в initComponents()
методе, и через некоторое время все вернулось к нормальной жизни.