0

最初に少し背景を。NetBeans で、コンストラクターで新しいスレッドを開始しないようにという警告が表示されました。その理由は、コンストラクターが実際にオブジェクトの作成を完了する前に、新しいスレッドが開始され、スレッドを開始したオブジェクトを参照しようとする可能性があるためだと読みました。

1.) 使用する代わりに実験のためnew Threadthread.start()試しExecutorServiceてみましたが、警告は表示されませんでした。 これは、コンストラクターで新しいスレッドを作成して開始しても問題ないということExecutorServiceですか?

2.) また、ExecutorServiceキャッシュされたスレッド プールの形式がある場合は、標準的な方法で新しいスレッドを作成し、キャッシュ プールからスレッドnew Threadthread.start()プルします (または、スレッドが利用できない場合はスレッドを作成させます)。それとも、これらのスレッドはキャッシュされたスレッド プールから完全に独立していますか?

4

3 に答える 3

5

1) [...]これは、コンストラクターで新しいスレッドを作成して開始しても問題ないということExecutorServiceですか?

this一般的な規則:完全に構築されるまで、構築中のオブジェクト ( ) への参照をリークしないでください。つまりthis、コンストラクター内の別の therad に渡さない、コンストラクター内からリスナーとして自分自身を追加しない、などです。つまりthis、コンストラクター内から関数へのパラメーターとして使用しないでください。

2) [...]の標準的な方法で新しいスレッドを作成し、キャッシュ プールからスレッドnew Threadthread.start()プルします[...]

いいえ、新しいオブジェクトを作成しないnewようにオーバーロードする方法はありません。このような場合、ファクトリ メソッドを使用する必要があります。

于 2010-09-29T13:19:20.137 に答える
1

1) いいえ、おそらく NetBeans の静的分析の制限にすぎません。もちろん、現在構築中のオブジェクトへの参照をリークしないのであれば、どちらの方法でも安全です。

構築中のオブジェクトへの参照をリークすることは、マルチスレッドの状況で危険なだけではありません。コンストラクターから自分自身をパラメーターとして渡して外部メソッドを呼び出したとしても、そのメソッドはあなたを不適切に使用する可能性があります。

2) いいえ、new常に新しいオブジェクトを作成します。例外はありません。あなたはスレッドプールを回っています。

于 2010-09-29T13:18:25.223 に答える
0

コンストラクターの義務は、オブジェクトを構築することだけです。Thread を拡張するオブジェクトがある場合は、コンストラクター内から start() を呼び出すべきではなく、他の別のオブジェクトが start() を呼び出す必要があります。

于 2010-09-29T13:45:44.140 に答える