11
public class CreateThreadRunnableExample implements Runnable {

    public void run() {

        for (int i = 0; i < 5; i++) {
            System.out.println("Child Thread : " + i);

            try {
                Thread.sleep(50);
            } catch (InterruptedException ie) {
                System.out.println("Child thread interrupted! " + ie);
            }
        }

        System.out.println("Child thread finished!");
    }

    public static void main(String[] args) {

        Thread t = new Thread(new CreateThreadRunnableExample(), "My Thread");

        t.start();

        for (int i = 0; i < 5; i++) {

            System.out.println("Main thread : " + i);

            try {
                Thread.sleep(100);
            } catch (InterruptedException ie) {
                System.out.println("Child thread interrupted! " + ie);
            }
        }
        System.out.println("Main thread finished!");
    }
}

このプログラムでは、異なる時間の2つのスリープメソッドが使用されます.. 、、、したがって、メインスレッドの実行時間の場合、子スレッドは2回実行する必要がありますが、1回だけ実行されます....実行可能または実行の概念を採用しています状態....その後、メインスレッドが終了すると、2つの子スレッドが準備完了状態になり、なぜ1つの子スレッドのみが実行されます。

4

4 に答える 4

3

まず、 System.out.println("Child thread interrupted! " + ie); を追加しました。メインスレッドと子スレッドの両方で、それはタイプミスです...

これを試してください...両方のスレッドが実行されています(メインスレッドと子スレッド)

このプログラムのメインメソッドは、JVM で作成されたメインスレッドの一番下に配置され、メインメソッドは別のランタイムスタックを作成し、その中に子スレッドを配置します。

public class DemoThread implements Runnable {

    public void run() {

        for (int i = 0; i < 3; i++) {
            System.out.println("Child Thread ");

            try {
                Thread.sleep(200);
            } catch (InterruptedException ie) {
                System.out.println("Child thread interrupted! " + ie);
            }
        }

        System.out.println("Child thread finished!");
    }

    public static void main(String[] args) {

        Thread t = new Thread(new DemoThread ());

        t.start();

        for (int i = 0; i < 3; i++) {

            System.out.println("Main thread);

            try {
                Thread.sleep(200);
            } catch (InterruptedException ie) {
                System.out.println("Child thread interrupted! " + ie);
            }
        }
        System.out.println("Main thread finished!");
    }
}
于 2012-05-22T07:27:31.347 に答える
2

JavaDocに記載されているように、sleepメソッドは 100% 時間正確ではありません。

public static void sleep(long millis) throws InterruptedException

現在実行中のスレッドを、指定されたミリ秒数だけスリープ (一時的に実行を停止) させます。これは、システム タイマーとスケジューラの精度と正確さに従います。スレッドは、どのモニターの所有権も失いません。

したがって、基本的にコードが期待どおりに機能する場合とそうでない場合があります。

また、子供は 1 人しかいないようですが、なぜ 2 人を期待しているのでしょうか。

編集: 理論的には、mainスレッドがスリープしている間に子スレッドを 2 回実行する必要があります。そうは言っても、JavaDoc で説明されているように、メソッドが実行される精度はsleep実行中のシステムに依存するため、期待どおりに動作する場合とそうでない場合があります。したがって、たとえば、スレッドがたとえば 100 ミリ秒ではなく 97 ミリ秒スリープし、子mainスレッドがたとえば 53 ミリ秒スリープするシナリオを作成できます。これにより、子は一度だけ実行されます。

別のオプションは、次のようにすることです while (currentTime <= timeNeededToElapse) { currentTime=... }。これによりタイトな while ループが発生し、制御が向上する可能性がありますが、私の知る限り、100% 正確ではないことは言うまでもありません。事実上何もしないために CPU サイクルを消費することになるため、注意して使用する必要があります。

于 2012-05-22T07:12:04.197 に答える
1

子スレッドを1つだけ開始しているのに、なぜ2つを期待しているのですか?

タイムアウトについては、スリープ時間は正確ではないため、1つのスレッドが100ミリ秒間スリープしている間、別のスレッドは50ミリ秒間2回スリープする場合としない場合があります。これは競合状態の典型的な例です。サンプルコードを数回実行すると、子スレッドメッセージが2つ表示される場合と、1つ表示される場合があります。

于 2012-05-22T07:08:32.497 に答える