2016-08-27 4 views
-3

コード:ここでは何が起こる以下のスレッドのコードで何が起こっていますか?

public class ThreadTest { 
    public static void main(String[] args) { 
     MyImlementThread mit = new MyImlementThread(); 
     Thread t = new Thread(mit); 
     t.start(); 
     t = new Thread(mit); 
     t.start(); 
    } 
} 


// MyImlementThread 
class MyImlementThread implements Runnable { 
    public void run() { 
     System.out.println("This is implemented run() method"); 
    } 
} 

/* 
Output 
This is implemented run() method 
This is implemented run() method 
*/ 

答えて

0

は、メインスレッドが2つのスレッドと終了を開始しています。新しいスレッドはそれぞれstdoutにメッセージを書き込み、終了します。その時点で、すべての非デーモンスレッドが終了したので、JVMは終了します。

投稿されたコードはRunnableを定義することで混乱しますが、Threadで終わる名前を付けると、これらの2つの異なる概念をはっきりと区別することができません。

スレッドオブジェクトはosレベルのスレッドに関連し、スレッドでstartを呼び出すと、渡されたRunnableのrunメソッドのコードが、startを呼び出したスレッドとは別のスレッドで実行されます。

Runnableはタスクを定義しますが、実行方法は指定していません。特定のThreadのコンストラクタに渡すことも、Executorに渡すことも、現在のスレッドで実行することもできます。

この場合、宣言されたRunnableには状態がなく、インスタンス変数は宣言されません。ここで2つのスレッドは、共有状態がないので、競合なしに同じRunnableを実行できます。コンソールに書き込むプリントストリームは、 と同期しているので、スレッドによって書き込まれた行はそれぞれ一度に1つずつ書き込まれ、混乱することはありません。

関連する問題