#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.