SWT / Swing -> Потоки в аду

#java #multithreading #swing #swt

#java #многопоточность #swing #swt

Вопрос:

У меня есть приложение SWT. Я был разочарован в SWT за то, что он не упростил выполнение того, что я хотел сделать. Поэтому я использовал Swing. Swing упростил мою жизнь. Ура. За исключением того, что теперь им нужно поговорить. Проблема в том, что они выполняются в разных потоках, и всякий раз, когда я пытаюсь запустить метод SWT GUI из Swing, я получаю:

 Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access
 

О радость. Итак, как мне это исправить? Если бы это был Objective-C, я мог бы использовать:

 - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait
 

Но это не так, поэтому я не могу. Нет ли способа запустить метод A в потоке B? Когда этот поток существует?

Ответ №1:

Я мало работал с SWT, но, похоже, SWT будет строго запрещать доступ к объекту SWT в потоке, отличном от пользовательского интерфейса. Вы можете поставить в очередь запрос на обращение к объекту на SWT.

Эта ссылка объясняет это лучше

В примере предлагается использовать syncExec

 display.syncExec(
  new Runnable() {
    public void run(){
      label.setText(text);
    }
  });
 

Я могу предположить, что это приведет к постановке в очередь Runnable в основном потоке пользовательского интерфейса SWT, и, следовательно, доступ будет законным.

Примечание: я снова перечитал ссылку, syncExec в конечном итоге заморозит ваш Swing EDT. Если вы вызовете syncExec, он выбросит Runnable в очередь SWT и будет ждать его завершения. Вы можете посмотреть на AsyncEvent, чтобы поместить runnable в очередь и продолжить работу.

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

1. Спасибо! Это полностью сделало свое дело! Я тоже заметил синхронизацию и асинхронность; не уверен, что будет лучше работать для моих целей, возможно, оба: D.