1

I am seeing interesting behavior. I am running this code

public class ThreadsTest {

    public static void main(String[] args) {
        Runnable mr = new MyRunnable();
        Thread t1 = new Thread(mr);
        Thread t2 = new Thread(mr);
        t1.setName("first");
        t2.setName("second");
        t1.start();
        t2.start();
        t1.run();
    } 
} 

class MyRunnable implements Runnable {
    public void run() {
    for (int i=0; i < 2; i++) {
        System.out.println("Running: " + Thread.currentThread().getName());
    }
    }
}

The output I get is:

Running: first
Running: first
Running: second
Running: second

I am expecting to see something similar to this:

Running: first
Running: first
Running: second
Running: second
Running: main
Running: main

Does anyone knows why I don't see Running: main somewhere in my output. Thank you.

4

2 に答える 2

8

説明は少し微妙です。

Thread.run()メソッドのデフォルトの動作は、提供されているRunnable場合は実行し、それ以外の場合は何もしないと説明されています。

微妙な点は、スレッドが終了すると、exit()メソッドが「積極的に」参照フィールドをヌルにして、ストレージのリークを防ぐことです。(これがソースです... 720行目以降です。)呼び出した時点でt1.run()スレッドmainが終了していたため、呼び出しはノーオペレーションでした。

main当然、出力は、子スレッドが終了する前にスレッドが再度実行されるかどうかによって異なります...そしてそれはプラットフォームによって異なります。たとえば、JVMとOSレベルのスレッドスケジューラの機能や、使用可能なコアの数などです。

于 2013-02-10T04:23:12.210 に答える
0

自分のマシンでコードを実行したところ、出力に「Running:main」と表示されます。

于 2013-02-10T04:23:38.253 に答える