0

私は実際にはJava分野の初心者であり、現在マルチスレッドの概念を学んでいます

私はあるプログラムに出くわし、そのプログラム自体に疑問を抱きました。

以下は私のプログラムです

public class SecondThreadDemo implements Runnable {
    public void run() {
        System.out.print(Thread.currentThread().getName());
    }
}

class B implements Runnable {
    public void run() {
        new SecondThreadDemo().run();
        new SecondThreadDemo().run();
        new Thread(new SecondThreadDemo(), "T3").run();
        new Thread(new SecondThreadDemo(), "T2").start();
        new SecondThreadDemo().run();
        new Thread(new SecondThreadDemo(), "T3").start();
    }
}

class C {
    public static void main(String[] args) {
        new Thread(new B(), "T1").start();
    }
}..

今私が期待していたのは、次の出力です

T1T1T1T1T3T3

しかし、それは次のようになります

T1T1T1T1T2T3

誰かが出力を明確にできますか?

4

3 に答える 3

10

と の間には違いがrunありstartます。

Runnableそれ自体は ではないThreadため、コードの残りの部分とインラインで実行されます (他のメソッドを呼び出すように)。

startrunあなたの例では、あなたのことができるスレッドをスケジュールRunnableします。

また、実行するたびに違いがあり、スレッドのスケジューリングがどのように機能するかによって異なります

たとえば、コードはこれを行います...

new SecondThreadDemo().run();
new SecondThreadDemo().run();
new Thread(new SecondThreadDemo(), "T3").run();
new Thread(new SecondThreadDemo(), "T2").start();
new SecondThreadDemo().run();
new Thread(new SecondThreadDemo(), "T3").start();

これは(おそらく)次のような出力になります...

T1 (run)
T1 (run)
T1 (run) (cause I'm in T1's thread context)
// Then it all depends...this MIGHT be the output...
{T1} (run)
{T2} (start)
{T3} (start)
于 2013-07-18T05:14:27.377 に答える
0

new SecondThreadDemo().run();- 単純な関数呼び出しなので、実行中のスレッドが T1 であるため T1

new SecondThreadDemo().run();- 単純な関数呼び出しなので、実行中のスレッドが T1 であるため T1

new Thread(new SecondThreadDemo(), "T3").run();- 単純な関数呼び出しなので、実行中のスレッドが T1 であるため T1

new Thread(new SecondThreadDemo(), "T2").start();- この時点で、T2 という名前のスレッドを作成して start を呼び出します。ここでは、T2 を出力できるか、または次の行が実行されて、このスレッドが T2 を出力する前に T1 を出力できるかによって異なります。

new SecondThreadDemo().run();- T1 シンプル関数呼び出し

new Thread(new SecondThreadDemo(), "T3").start();- 期待どおりの T3

したがって、JVM出力に依存します T1T1T1T1T2T3 または T1T1T1T2T1T3

于 2013-07-18T07:28:48.000 に答える