ブライアン・ゲッツのこの記事を読んでいました。「コンストラクター内からスレッドを開始しない」セクションで、彼は次のように述べています。「リスト4の問題の特殊なケースは、コンストラクター内からスレッドを開始することです。オブジェクトがスレッドを所有している場合、そのスレッドは内部クラスであるか、この参照をコンストラクターに渡します(またはクラス自体がThreadクラスを拡張します)。オブジェクトがスレッドを所有する場合は、オブジェクトがThreadと同様にstart()メソッドを提供し、スレッドを開始するのが最適です。コンストラクターからではなく、start()メソッドから。「オブジェクトがスレッドを所有している場合が多い」とはどういう意味ですか?
3 に答える
どちらか、または両方にすることができます。スレッドはオブジェクト(クラスのインスタンス)によって表され、java.lang.Thread
そのオブジェクトが他のオブジェクトとどのように関連するかは完全にあなた次第です。
スレッドで実行されているコードが、スレッドによってのみ使用されるオブジェクトを作成する場合、それらのオブジェクトはスレッドによって所有されていると考えることができます。また、スレッドの作成、開始、および制御を担当する他のオブジェクトがある場合は、そのオブジェクトをスレッドの所有者と見なすことができます。しかし、これらのことはどちらもJavaによって要求または強制されることはありません。それはあなたのソフトウェアを設計するときのあなたの選択です。
Goetzの意図する意味は非常に単純であり、に固有のものではありませんThread
。これは単に、オブジェクトがThread
コンポジションリレーションを介してインスタンスを所有していることを意味します。つまり、オブジェクトへのプライベート参照を保持し、外部オブジェクトがインスタンスにアクセスすることを許可しません。
また、この種の所有権は、そのスレッドで実行されるコードもメソッドThread
を介してインスタンスにアクセスできるため、実際には強制力がないことに注意してください。currentThread
Goetzは、スレッドを所有するオブジェクトについて文字通りに解釈されることを意味するとは思いません。彼は、スレッドが他のオブジェクトのコンストラクター内で開始されたことを意味しているため、おそらく、構築が完了する前に、そのオブジェクトの状態にアクセスできます。正式で意味のある所有関係はありません。それはすべて状況に応じたものです。たとえば、スレッドへの参照を持っている人は誰でも、それをキャンセルできるので所有者であると言うかもしれませんが、参照は渡される可能性があり、最初にスレッドを作成したオブジェクトについて特別なことは何もありません。
Goetzの著書「JavaConcurrencyinPractice」を読むと、スレッドが相互作用するものの範囲が制限されているスレッドの制限などの設計手法がカバーされています。また、ThreadLocalを使用する場合など、1つのスレッドだけがオブジェクトを表示できるようにオブジェクトを作成することもできます。したがって、所有権の関係を作成するために抽象化を設計できますが、それはあなた次第です。