Краткий ответ на мой вопрос: «Вы не можете: вы никогда не должны пытаться получить доступ к компоненту Swing [и включая его модель] из какого-либо потока, кроме EDT».
Этот пост показывает, как я в конечном итоге решил проблему. Рабочий поток должен извлечь элемент из модели JList и делает это с помощью invokeAndWait()
для планирования этой работы на EDT , а затем ждет, пока эта задача будет выполнена, и затем продолжает.
Использование синхронизированного LinkedBlockingDeque не сработало, и я подозреваю, что это связано с тем, что EDT выполняет неатомные серии вызовов интерфейса Deque при обновлении компонента GUI. Любое изменение в модели между вызовами другим потоком может разрушить любые предположения о стабильности, которые делает EDT.
(Возможно, именно об этом намекает постоянное « Предупреждение: Swing не безопасен для потоков», который встречается в документации Swing.)