1

私は scjp の研究を行っています。私の質問は次のとおりです。

public class Bunnies extends Thread{


    public static void main(String[] args) {
        Thread t = new Thread(new Bunnies());
        Thread t1 = new Thread(new Bunnies());
        t.start();
        t1.start();

    }
    public  void run()
    {
        for(int i=0; i<3; i++)
        {
            System.out.println(Thread.currentThread().getName()+"  ");
        }
    }

}

上記のプログラムを実行すると、次のような o/p が得られます。

Thread-1  
Thread-1  
Thread-1  
Thread-3  
Thread-3  
Thread-3  

ここで、スレッド 2 がここに表示されず、スレッド 1 と 3 のみが表示される理由がわかりません。

説明してください。

4

5 に答える 5

4

Bunniesを拡張するを作成するたびに、したがって、数値のギャップThreadも作成します。Thread

あなたの最初の実行:Thread t = new Thread(new Bunnies());new Bunnies()でありThread-0tですThread-1
次に、を実行しますThread t1 = new Thread(new Bunnies());new Bunnies()でありThread-2t1ですThread-3

ただし、javadocは番号が連続することを保証しないため、スレッド番号に依存しないように注意してください。

次のコードで確認できます。

public static void main(String[] args) {
    Bunnies b = new Bunnies();
    Thread t = new Thread(b);
    Bunnies b1 = new Bunnies();
    Thread t1 = new Thread(b1);
    System.out.println(b.getName()); //Thread-0
    System.out.println(t.getName()); //Thread-1
    System.out.println(b1.getName()); //Thread-2
    System.out.println(t1.getName()); //Thread-3
}
于 2012-12-17T11:44:10.810 に答える
1

ここで、Thread-2 がここに表示されない理由がわかりません。スレッド 1 と 3 のみ。

抽象ビューには、少なくとも 5 つのスレッドがあります: maintおよびt1。(および 2 つの匿名スレッド)

class Bunnies extends Thread

そのため、 class のオブジェクトを作成するBunniesと、スレッドが作成され、JVM によって名前が割り当てられます。

mainメソッドを実行せずrun、匿名スレッドが開始されないため、つまり、呼び出さstart()れません。メソッドのみtt1実行するrunため、2 つのスレッド名しか取得できません。

命名の順序は次のとおりです。

ここに画像の説明を入力

于 2012-12-17T11:42:21.990 に答える
0

スレッド名を明示的に指定しない場合、スレッド名はランタイム環境によって生成されます。

これらのスレッド名を生成するのは実行時の責任です。おそらく、「Thread-2」という名前はすでに使用されていたため、たとえばバックグラウンドスレッドの場合、次に使用できるのは「Thread-3」でした。

@assyliasが正しく認識されているように、Thread-2すでに使用されている理由は、Bunniesそれ自体がスレッドであるためです。したがって、スレッドを作成するときにt、ランタイムが一意の名前を作成する1つだけでなく2つのスレッドがすでに作成されています。

于 2012-12-17T11:44:27.263 に答える
0

さて、あなたには2つのBunniesスレッドがあります。それらにどのように名前を付けるかは、ランタイム次第です。あなたの場合、それらを呼び出すことを選択しThread-1Thread-3. おそらく、これはThreadではなくサブクラス化するために発生しますRunnable。その結果、4 つのスレッド オブジェクトが作成され、そのうちの 2 つだけが個別のスレッドとして実行されます。

それらを別の名前にしたい場合は、Thread.setName()メソッドを使用できます。

于 2012-12-17T11:43:14.877 に答える
0

あなたのコードでは、Bunnies は Thread(and a Runnable) ですが、Runnable にすぎないので使用します。実際には次のようにする必要があります。

public class Bunnies extends Thread {

    public static void main(String[] args) {
        Thread t = new Bunnies();
        Thread t1 = new Bunnies();
        t.start();
        t1.start();

    }

    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName() + "  ");
        }
    }
}

またはこのように:

public class Bunnies implements Runnable{

    public static void main(String[] args) {
        Thread t = new Thread(new Bunnies());
        Thread t1 = new Thread(new Bunnies());
        t.start();
        t1.start();

    }

    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName() + "  ");
        }
    }
}
于 2012-12-17T12:45:45.677 に答える