Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Запуск нового потока в конструкторе? / 2 сообщений из 2, страница 1 из 1
10.11.2012, 23:54:44
    #38033333
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск нового потока в конструкторе?
просматривал чужой код в Netbeans и в одном месте
он выдал такое предупреждение

Запуск нового потока в конструкторе может привести к непредвиденным результатам, его следует избегать

кто-нибудь может объяснить более популярно, что может скрываться под этим предупреждениям и к камим результатам может привести?
...
Рейтинг: 0 / 0
11.11.2012, 00:09:07
    #38033348
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск нового потока в конструкторе?
Курить Java concurrency in practice до просветления:)

Ну на пальцах долго обьяснять, есть такое понятие как safe publicaton - это когда ссылка на объект становится видимой для других потоков, когда она содержит заведомо инициализированный объект. Смотрите, вы в конструкторе запускаете поток, он может начать выполняться до того, как закончит выполнение код вашего конструктора - в итоге вы можете отгрести кучу проблем.
Эту проблему решают таким образом - делают метод init(), в коде которого запускают новый поток, так как метод init выполняется на какой-то ссылке - то ее конструктор гарантированно успел отработать. в общем идиома такая

Код: java
1.
2.
SomeObject s = new SomeObject();
s.init();


Конечно это добавляет геморроя для клиентов класса(надо незабыть его вызвать, но в многопоточных приложениях это меньшее зло)

Мое обьяснение не совсем корректное, об этой теме можно говорить и говорить - а лучше читать) Я вам так - на пальцах пытался обьяснить..
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Запуск нового потока в конструкторе? / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]