EventQueue.invokeLater vs Thread.start

1

Для приложений Swing есть причина, по которой мы используем EventQueue.invokeLater()? Должен ли Thread.start() работать одинаково?

Еще одно преимущество Thread.start заключается в том, что мы можем сказать, что поток прерывается, поскольку EventQueue.invokeLater не предоставляет нам объект Thread.

Теги:
multithreading
swing

2 ответа

3

Вы должны использовать EventQueue.invokeLater для всех обновлений графического интерфейса, так как Swing в одностороннем порядке. См. Http://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading

Вы можете запускать потоки для выполнения вычислений и т.д., Но должны обновлять GUI с помощью invokeLater.

  • 0
    Так что, если вы не обновляете GUI, а обновляете «модель», нормально ли использовать Thread.start или мы все равно должны использовать EventQueue.il?
  • 0
    @Archimedes Trajano: Если обновление вашей модели будет блокировать графический интерфейс на длительный период времени, вы должны обновить модель в отдельном потоке. «Длинный период времени» составляет более 200 миллисекунд.
Показать ещё 6 комментариев
2

Ваши два варианта запуска приложения Swing:

EventQueue.invokeLater()

а также

SwingUtilities.invokeLater()

Я предпочитаю использовать SwingUtilities. Оба они помещают runnable в поток Event Dispatch (EDT). Вам не нужна ручка для EDT.

Ваш код находится либо на EDT, либо другой вызов метода invokeLater() помещает runnable в EDT. Вы можете определить любое условие с помощью вызова метода SwingUtilities.isEventDispatchThread().

Метод Thread.start() предназначен для ваших собственных рабочих потоков. Или, если хотите, вы можете использовать класс javax.swing.SwingWorker для собственных потоков рабочих Swing.

Здесь шаблон, который я использую для запуска каждого приложения Swing, я пишу.

package com.ggl.game2048;

import javax.swing.SwingUtilities;

import com.ggl.game2048.model.Game2048Model;
import com.ggl.game2048.view.Game2048Frame;

public class Game2048 implements Runnable {

    @Override
    public void run() {
        new Game2048Frame(new Game2048Model());
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Game2048());
    }

}

Короче и точно. Этот класс делает 3 вещи.

  1. Помещает приложение Swing на EDT.
  2. Создает модель приложения Swing.
  3. Создает приложение Swing JFrame.

Вы можете увидеть остальную часть приложения Swing 2048 в моей статье Java.

  • 0
    Спасибо, обычно я так делаю, но это не относится к моему вопросу.
  • 0
    ну за исключением этого одного абзаца "Thread.start () ..."
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню