2010-09-29 1 views
0

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

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

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

ответ

5

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

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

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

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

+0

спасибо, вы объяснили обе точки хорошо. – ubiquibacon

1

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

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

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

+0

спасибо за хороший ответ, но aioobe упрощенных его вниз для меня немного больше. – ubiquibacon

0

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