2016-11-29 21 views
-1
class MyRunnable implements Runnable 
{ 
    MyRunnable(String name) 
    { 
     new Thread(this, name).start(); 
    } 
    public void run() 
    { 
     System.out.println("run() called by " + Thread.currentThread().getName()); 
     System.out.println(Thread.currentThread().getName()); 
    } 
} 
public class TestClass 
{ 
    public static void main(String[] args) 
    { 
     System.out.println(Thread.currentThread().getName()); 
     Thread.currentThread().setName("First"); 
     MyRunnable mr = new MyRunnable("MyRunnable"); 
     mr.run(); 
     Thread.currentThread().setName("Second"); 
     mr.run(); 
    } 
} 

出力はメイン 、 まず、 第二に、 なりますMyRunnableThread.currentThread()。setName()はスレッドの実行メソッドを呼び出しますか?

にThread.currentThread()の呼び出しのsetName( "第一")を行い、なぜ

。 run()メソッドを呼び出しますか?

+3

あなたはどう思いますか? – Paul

+4

'新しいスレッド(これ、名前).start();' ctor?ダメダメダメ**。これほど決して、決してこれをしないでください。冗談でもありません。 –

+2

あなたは競合状態に対処しています。 – nhaarman

答えて

2

これはありません。あなたが目にしているのはrace conditionです。 MyRunnableコンストラクタで新しいThreadを開始しただけで、main()メソッドでmr.run()が呼び出される前に実行されるわけではありません。スレッドの開始に伴うオーバーヘッドがあり、それには時間がかかります。 main()メソッドにThread.sleep()を挿入すると、出力が変更されます。

関連する問題