С учетом модели памяти J5 + (JSR-133) приведен следующий код, безопасный по потоку и допустимый?Могу ли я запустить поток из конструктора?
И если это безопасно, приемлемо ли это в некоторых ситуациях?
public final class BackgroundProcessor
extends Object
implements Runnable
{
public BackgroundProcessor(...) {
super();
...
new Thread(this).start();
}
public void run() {
...
}
}
Как я прочитал новый JMM спецификации, инициируя нить создает происходит, прежде, чем отношения с чем инициируемая нить делает.
Предположим, что объект имеет переменные частного члена, установленные в конструкторе и используемые в run().
И класс отмечен как окончательный, чтобы предотвратить сюрпризы подкласс.
Примечание: Существует аналогичный вопрос здесь, но это имеет другой угол: calling thread.start() within its own constructor
Я бы предположил, что не стоит ничего делать в конструкторе за пределами поля инициализации. Это сделает ваш код очень трудным для тестирования. Вот полезная статья, которая объясняет это намного лучше, чем я могу: http://misko.hevery.com/code-reviewers-guide. Я изначально поставил это как ответ, но на самом деле он не отвечает на ваш вопрос, поэтому вместо этого он является комментарием. – bm212
@ bm212: Хорошая ссылка (+1). Хотя это специальная конструкция, для которой я пытаюсь определить, нужен ли рефакторинг и на каком уровне приоритета. –