2016-09-11 17 views
0

私は小さなマルチスレッドプログラムを書いています。run()はThread.start()メソッドによって呼び出されません

これは本の記述方法です。しかし、私は決してrun() method calledステートメントをコンソールに持っていません。したがって、run()は決して呼び出されないようです。これはどうやって真実だろうか?

編集:はい、コンストラクタからスレッドを開始するのは悪い習慣ですが、問題には影響しません。 (私はそのためのダウン非常に多くの票を取得しています)

+2

コンストラクタでスレッドを開始しないことを強くお勧めします。それ以外の場合は、新しいスレッドが開始されるのを待たずに、何かを印刷する機会がありません。あなたは 'join()'する必要があります。 –

+0

あなたの問題は正確ですが、あなたのコードはこの結果を返す**コンストラクタによって作成されました:Thread [Thread Classによって作成されたスレッド、5、メイン] run()メソッドは** –

+0

@YoucefLaidaniいいえです。それはできません。結果は競争の危険であり、その結果は不明である。 –

答えて

9

実行()Thread.startによって呼び出されることはありません()メソッド

あなたのコードは、実際に私のシステム上で動作しますが、それが動作しませんクラシック競争状態にあることを実証しています。 main()の内部

NewThreadを構築しますが、Java言語は、コンストラクタでの操作が後コンストラクタ仕上げを起こることができるように、それは操作の順序を変更できることを述べています。したがって、main()を終了する可能性があります。NewThreadが実際に起動されたため、スレッドを実行しないでJVMがシャットダウンする可能性があります。

命令の並べ替えのために、スレッドが自動的にコンストラクタの内部で自動的に開始しないようにする必要があります。参照:Why not to start a thread in the constructor? How to terminate?

あなたが代わりに行う必要があります。

public NewThread() { 
    t = new Thread(this, "Thread created by Thread Class."); 
    System.out.println("Created by constuctor:" + t); 
    // don't start here 
} 
public void start() { 
    // start in another method 
    t.start(); 
} 
public void run() {  
    System.out.println("run() method called.");  
} 
... 

public static void main(String[] args) { 
    NewThread nt = new NewThread(); 
    nt.start(); 
} 

NewThreadnt.run()完了するまでJVMしませんシャットダウン(非デーモンである)あなたのメインスレッドと同じデーモンのステータスを持っているので。

+0

便利なリンクhttp://www.ibm.com/developerworks/library/j-jtp0618/(後で参考のためにここに入れて、あなたは答えからそれを削除しました。) –

+0

ありがとう@AnilBhaskar。私はまだトピックに関するより良いページを探しています。 – Gray

関連する問題