Несколько вопросов о Threading в Java - PullRequest
0 голосов
/ 29 сентября 2010

Сначала немного фона.В NetBeans я получил предупреждение о том, что не следует создавать новый поток в конструкторе.Я читал, что причина этого в том, что новый поток может запуститься и попытаться сослаться на объект, запустивший поток до того, как конструктор фактически завершит создание объекта.

1.) Для экспериментов вместоиспользуя new Thread и thread.start() я пробовал ExecutorService и не получил предупреждения. Означает ли это, что можно создать и запустить новый поток в конструкторе, если я использую ExecutorService?

2.) Кроме того, если у меня есть ExecutorService в формекэшированного пула потоков создаст новый поток стандартным методом new Thread и thread.start(), вытянет поток из пула кэша (или заставит его создать один, если он недоступен), или эти потоки полностью независимыпула кэшированных потоков?

Ответы [ 3 ]

5 голосов
/ 29 сентября 2010

1) [...] Означает ли это, что можно создать и запустить новый поток в конструкторе, если я использую ExecutorService?

Общее правило: не пропускайте ссылку на строящийся объект (this), пока он не будет полностью построен. То есть не отдавайте this другому therad в конструкторе, не добавляйте себя в качестве слушателя из конструктора и т. Д., Т. функция из конструктора.

2) [...] будет создавать новый поток стандартным методом new Thread и thread.start() извлекать поток из пула кэша [...]

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

1 голос
/ 29 сентября 2010

1) Нет, возможно, это всего лишь ограничение статического анализа NetBeans. Конечно, это можно сделать в любом случае, если вы не пропустите ссылку на объект, который в настоящее время создается.

Утечка ссылки на конструируемый объект не только опасна в многопоточных ситуациях. Даже если вы вызываете внешний метод из конструктора, передавая себя в качестве параметра, метод может использовать вас ненадлежащим образом.

2) Нет, new всегда создает новый объект, без исключений. Вы идете вокруг пула потоков.

0 голосов
/ 29 сентября 2010

Обязанность конструктора - просто создать объект, если у вас есть объект, расширяющий Thread, вы не должны вызывать start () из конструктора, другой объект должен вызывать start ().

...