invokeLater против invokeAndWait с JTextArea

У меня есть приложение Swing, которое работает в нескольких потоках, я создал компоненты Swing в EDT. Executor запускает потоки, которые в какой-то момент вставляют текст в JTextArea. Однако InvokeLater не всегда выполняет добавление, в отличие от InvokeAndWait. Как я понял, он синхронный, неблокирующий, но все же должен делать добавление. Как это может быть?

Спасибо


person Jhonny    schedule 14.11.2015    source источник
comment
Оба они добавляются в конец очереди. Я не уверен, к чему ты клонишь?   -  person WalterM    schedule 14.11.2015
comment
"InvokeLater doesn't always do the appending...", у вас, вероятно, есть ошибка где-то в вашем коде, и, вероятно, она не связана с invokeLater как таковым, но она разоблачается. Время заняться отладкой.   -  person Hovercraft Full Of Eels    schedule 14.11.2015
comment
Делал это так долго, но спасибо за прояснение этого, думаю, ошибка где-то еще.   -  person Jhonny    schedule 14.11.2015
comment
@HovercraftFullOfEels, вероятно, прав в том, что проблема разоблачена. Если что-то не всегда работает, заподозрите ошибочную синхронизацию.   -  person trashgod    schedule 14.11.2015


Ответы (1)


Использование EventQueue.invokeLater() для обновления модели компонента из другого потока является необходимым, но не достаточным условием правильной синхронизации. Вам по-прежнему необходимо синхронизировать доступ к любым общим данным. В этом примере параметр display() s является ссылкой final на неизменяемый String; к нему можно безопасно получить доступ в display() без дальнейшей синхронизации. Если у вас есть final ссылка на изменяемый объект, рассмотрите возможность использования потокобезопасная коллекция. Вы можете искать нарушения, используя один из подходов, приведенных здесь. В качестве альтернативы рассмотрите возможность размещения фоновой задачи на SwingWorker для пример.

person trashgod    schedule 14.11.2015
comment
Это самый хороший ответ, который можно дать, учитывая представленные данные. Надеюсь, ОП представит более конкретные данные, чтобы вы могли дать более конкретные советы. Спасибо за ответ! - person Hovercraft Full Of Eels; 15.11.2015