Имеется два потока. Первый обрабатывает графический интерфейс, а другой должен получить значение переменной, вводимой пользователей в первом потоке. Я два дня искал информацию, но никакого толкового объяснения не нашёл.
public class s implements Runnable {
public static void s(){
System.out.println("тест");
}
@Override
public void run() {
s();
}
}
class Testpotok {
public static void main(String[] args) {
Thread t1 = new Thread(new s());
t1.start();
System.out.println("тест1");
}
}
Ответ
Swing, как и многие другие gui-библиотеки, однопоточен. При создании окна создаётся Event Dispatch Thread, внутри которого будет работать цикл событий и обработчики событий. Вы не должны пытаться из главного потока или любого другого потока взаимодействовать с элементами графического интерфейса - это приведёт к сбою. Вы не должны внутри обработчиков событий запускать потоки - это приведёт к сбою. Если вам надо из другого потока изменить, например, текст метки, то придётся создать задание для EDT:
SwingUtilities.invokeLater(() -> someLabel.setText("Hello"));
Если вам нужно внутри обработчика нажатия на кнопку запустить на выполнение длительную задачу, придётся использовать SwingWorker
SwingWorker worker = new SwingWorker
@Override
protected void done() {
// Выполняется в EDT после завершения doInBackground
}
};
worker.execute();
Комментариев нет:
Отправить комментарий