Страницы

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

вторник, 31 марта 2020 г.

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

#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();

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

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