3

私はJavaの初心者で、現在トレーニング資料を使用しています.以下のコードは次の出力を生成します:

Run. Run. doIt

どのように実行を印刷しますか。二回?t.join() はどのように機能しますか?

public class TestTwo extends Thread {
    public static void main (String[] a) throws Exception {
        TestTwo t = new TestTwo();
        t.start();
        t.run();
        t.join();
        t.doIt();
    }
    public void run() {
        System.out.print("Run. ");
    }
    public void doIt() {
        System.out.print("doIt. ");
    }
  }
4

4 に答える 4

4

t.start()のコードを実行する新しいスレッドの実行を開始しますt.run()。しかし、への呼び出しt.start()はすぐに戻ります。そのスレッドが の実行を終了するのを待ちませんrun()。リターン後t.start()、メイン スレッドが実行されt.run()ます。t最後に、スレッドが終了するのを待ちますt.join()。このメソッドはすぐには戻りませんが、代わりにスレッドが終了するのを待ちます。(たまたま、この場合は非常に高速になりますが、数分、数時間、または永遠にかかる可能性があります。)

制御フローは次のようになります。

Thread A
|
+- t.start() ---> starts Thread B
+- t.run()               +- t.run()
|                        |
+- t.join() waits for B  |
|           to finish    |
|               \------> +- Thread B stops
+- t.doIt()
+- Thread A stops
于 2013-07-10T22:04:55.207 に答える
1

このstart()メソッドによってスレッド オブジェクトが実行され (いつ実行されるかは不定)、JVM がそのrun()メソッドを呼び出します。

ただしrun()、直接呼び出すこともできるため、run()2 回実行されます。

呼び出しは、メソッドが終了join()した後に発生するスレッドの終了を待ちます。run()

于 2013-07-10T22:06:04.430 に答える
1
t.run();

無関係な呼び出しです。

でスレッドを開始すると、t.start()独立して開始されます。これにより、「実行」が画面に出力されます。

次に、t.run(スレッドのrun(メソッド実行しますrun。これら 2 つの「実行」の印刷は、どちらの順序でもかまいません。

最後に、 を呼び出しますt.join。これは、スレッドが終了するのを待ちます (結合の設計による印刷の後、および実行からの印刷の後、run呼び出しが前にブロックされているためです。

joindoIt 関数がブロッキング方式で呼び出された後。

簡単に言えば、メインスレッドとtスレッドの両方が印刷され、メインスレッドはスレッドの印刷が完了するrunまで待機します。tdoIt

呼び出しの多くはtスレッド化の一部ですが、インスタンスとは多少独立して機能します。

于 2013-07-10T22:04:57.753 に答える
1

印刷することもあります

RRuunn..  doIt
于 2013-07-11T00:09:16.730 に答える