#java #многопоточность
Имеется два потока. Первый обрабатывает графический интерфейс, а другой должен получить значение переменной, вводимой пользователей в первом потоке. Я два дня искал информацию, но никакого толкового объяснения не нашёл. 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"); } }
Ответы
Ответ 1
Swing, как и многие другие gui-библиотеки, однопоточен. При создании окна создаётся Event Dispatch Thread, внутри которого будет работать цикл событий и обработчики событий. Вы не должны пытаться из главного потока или любого другого потока взаимодействовать с элементами графического интерфейса - это приведёт к сбою. Вы не должны внутри обработчиков событий запускать потоки - это приведёт к сбою. Если вам надо из другого потока изменить, например, текст метки, то придётся создать задание для EDT: SwingUtilities.invokeLater(() -> someLabel.setText("Hello")); Если вам нужно внутри обработчика нажатия на кнопку запустить на выполнение длительную задачу, придётся использовать SwingWorker: SwingWorker worker = new SwingWorker() { @Override protected void doInBackground() throws Exception { // Выполняется в отдельном потоке } @Override protected void done() { // Выполняется в EDT после завершения doInBackground } }; worker.execute();
Комментариев нет:
Отправить комментарий