Как передать объект класса в потоке?
Есть 2-а класса: public class GUIMain extends JFrame и public class Tools extends GUIMain. В классе "Tools" есть метод run() внутри которого следующая конструкция:
Thread thread = new Thread(new Runnable() {
public void run() {
// ..... code .....
if (table.getRowCount() == 0) {
JOptionPane.showMessageDialog(GUIMain.this,
"Your Search String was not found. Please try another.", "Search String Not Found",
JOptionPane.WARNING_MESSAGE);
}
}
});
thread.start();
}
Вопрос: Как передать объект GUIMain.this ?
p.s. Нашёл кусочек программы в старой книге по Java и пытаюсь её переписать, разделив один большой класс, содержащий весь код программы (сотни строк), на два удобных класса.
Ответы (1 шт):
Данная проблема связана не с многопоточностью как таковой, а со ссылкой на экземпляр внешнего класса из экземпляра внутреннего анонимного класса Runnable. Экземпляр внутреннего класса не может существовать вне экземпляра своего внешнего класса.
Скорей всего, данная реализация метода run была скопирована/перенесена из класса GUIMain в класс Tools, при этом внешний класс изменился и тогда ссылку на внешний класс необходимо соответственно изменить на Tools.this:
JOptionPane.showMessageDialog(Tools.this,
"Your Search String was not found. Please try another.",
"Search String Not Found", JOptionPane.WARNING_MESSAGE
);
Или же можно отрефакторить код, и определить метод showOptionPane в классе GUIMain, чтобы избавиться от ссылок на конкретный внешний класс. Также можно использовать лямбду вместо создания анонимной имплементации Runnable:
class GUIMain extends JFrame {
protected void showWarning(String msg, String title) {
JOptionPane.showOptionPane(this, msg, title, JOptionPane.WARNING_MESSAGE);
}
}
class Tools extends GUIMain {
public void run() {
// ...
new Thread(() -> {
//...
showWarning(
"Your Search String was not found. Please try another.",
"Search String Not Found"
);
})
.start();
}
}