2012-01-23 3 views
2

Я хочу использовать this Swing snippet для создания изображения с текстовой метки из приложения, отличного от Swing (например, веб-сервис, написанный с использованием Play Framework).Создает изображение с Swing потокобезопасным?

Я никогда не использовал Swing и видел, что «он не является потокобезопасным». Это относится к минимальному коду, который я планирую запустить? Должен ли я синхронизировать доступ к этому коду?

Если я понимаю ответы о Swing thread-safety правильно, то если метод explicitally не говорит, что это безопасно, то это не ... и методы, которые я использую (в частности BufferedImage.getGraphics(), кажется, не имеют этот кусок Javadoc). Итак, если не указано иное, я собираюсь синхронизировать.

+2

Почему вы обеспокоены безопасностью потоков? Вы собираетесь создавать изображение извне потока отправки событий? –

+0

@JBNizet - Я не пишу полноценное приложение для качания. Я намерен использовать этот метод на веб-сервере Play для создания изображений. – ripper234

ответ

2

«Небезопасный поток» означает, что вы не должны обращаться к одной и той же вещи из нескольких потоков одновременно.
Нет ничего плохого в запуске этого кода в фоновом потоке, если вы не разделяете объекты по потокам.

Обратите внимание, что большинство (не-UI) объектов являются потокобезопасными для работы только для чтения.

+0

Я сомневаюсь, что они все равно будут потокобезопасными, если что-то еще захочет написать им. Поскольку вам не хватает ключевого слова 'const' в Java, я не знаю, как вы были бы уверены, что это был только для чтения. Иногда старше лучше. – John

+2

Err, no. Компоненты Swing должны быть доступны из EDT. И нет, большинство объектов не являются потокобезопасными для операций только для чтения. –

+0

Правильно, я был обеспокоен тем, что что-то может быть разделено между разными объектами. Я буду использовать новый объект в потоке, поэтому, думаю, я не должен волноваться. Благодарю. – ripper234

1

EDIT: на самом деле вы можете вырезать все относящиеся к Swing части в вашем «Swing snippet», так как вы действительно заботитесь о части изображения, которая не имеет никакого отношения к Swing.

Не волнуйтесь ни о чем: ваш код не является многопоточным.

Где это усложняется с помощью Swing, когда у вас есть определенный интерфейс. Интерфейс запускается из специального потока (поток передачи событий или EDT), который представляет собой другой поток из основного потока, в котором выполняется ваша программа. Если вы обновите какое-то значение в своей основной программе, вы должны быть осторожны с проблемой многопоточности, иначе ваше обновленное значение никогда не будет отображаться на экране.

Поскольку вы используете некоторые методы из библиотеки Swing без EDT, это похоже на использование любого метода из обычной библиотеки.

Смежные вопросы