Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Как из одного потока передать переменную в другой поток?

Имеется два потока. Первый обрабатывает графический интерфейс, а другой должен получить значение переменной, вводимой пользователей в первом потоке. Я два дня искал информацию, но никакого толкового объяснения не нашёл.
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 doInBackground() throws Exception { // Выполняется в отдельном потоке }
@Override protected void done() { // Выполняется в EDT после завершения doInBackground } };
worker.execute();

Комментариев нет:

Отправить комментарий