2016-04-17 9 views
0

フィールドを初期化した後に、そのコンストラクタの内部からスレッドを開始することはできますか?一般に、コンストラクタの内部からスレッドを開始するのは悪い習慣ですか?たとえば :一般的にコンストラクタ内部からスレッドを開始する

class A extends Thread{ 
     private String s; 
     private int x 
     public A(String str,int xx){ 
     s = str; 
     x = xx; 
     start(); 
     } 
     public void run() { System.out.println(s + " " + x);} 

    } 
+3

まず、スレッドを拡張するのは悪い習慣です。これは問題ではありません。しかし、そうでない場合でも、投稿したものは良いアイデアではありません。オブジェクトの作成が完了する前にオブジェクトを批判的に使用することは決して良いことではありません。 –

+0

スレッドを拡張することが悪い習慣である理由を説明できますか?私は制限を見ることができます(拡張することはできません)が、それ以外の選択肢はかなりあります。 –

答えて

0

私のコメントに記載されているように、スレッドを拡張することは悪い習慣であり、質問は問題ではありません。しかし、もう一度、あなたの提案されたコードは「悪い練習」以上のものです。危険です。オブジェクトが完全に構築される前に、オブジェクトに対してクリティカルなアクションを実行しているので、予期せずにバグや副作用をデバッグすることがあります。また、これによりコードの柔軟性が大幅に制限されるようになりました。今では、スレッドを1つの唯一の方法で使用する必要があります。

Runnableスレッドまたはextendsスレッドを実装する別の問題については、this oneを含む複数のスレッドでこのサイトでよく議論されていますので、ぜひご覧ください。

0

それが唯一の外からオブジェクトを制御するための良い方法ですが、それゆえgetterメソッドとsetterメソッドetc..the同じだけで、悪くないん匂いそのようなスレッドを開始、ここで適用されますそれをやる。

+0

私の考えは正確です。私はこれをJavaの並行処理のいくつかの例で見てきましたが、それが通常の実装かどうかを知りたい –

関連する問題