1

マルチスレッドは初めてで、いくつかの質問と混乱に遭遇しました。:)

public class NewThread implements Runnable {

    Thread  t;

    NewThread() {
        t = new Thread(this, "Demo Thread");
        System.out.println("Child Thread " + t);
        t.start();
    }

    @Override
    public void run() {

        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("Child Thread: " + i);
                Thread.sleep(500);
            }
        } catch (InterruptedException e) {
            System.out.println("Child Interrupted.");
        }

        System.out.println("Exiting Child Thread.");
    }

}

class ThreadDemo {

    public static void main(String[] args) {

        NewThread t = new NewThread();

        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("Main Thread: " + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            // TODO: handle exception
            System.out.println("Main Thread Interrupted.");
        }

        System.out.println("Main Thread Exiting.");
    }

}

例外出力

ここに画像の説明を入力

私の出力

ここに画像の説明を入力

コンソールの出力が予想される出力と異なるのはなぜですか? ありがとうございました。

4

4 に答える 4

0

あなたが投稿したコードは大丈夫です!期待どおりの出力が得られました。

メインの変数「t」を他の変数「t」でオーバーライドしている他のコードを開始しているのではないかと思います。コードの一部を静的として宣言した可能性があります。

于 2013-01-04T07:04:04.720 に答える
0

tNewThread クラスの変数はNewThread型ではないため、子スレッド ループは実行されません。NewThread オブジェクトで start() を呼び出すことはないため、その実行からの出力が表示されないことは理にかなっています。

System object は静的であり、この VM で実行されているすべてのスレッドによって共有されます。

于 2013-01-04T01:50:47.790 に答える
0

問題は、 NewThread クラスのコンストラクターが呼び出されていないことだと思います。コンストラクターの奇妙な部分

  NewThread() {
        <STUFF>
    }

アクセス修飾子がありません。つまり、publicキーワードがありません。これにより、コンストラクターがパッケージ プライベートになります。クラスが別のパッケージにある場合ThreadDemo、コンストラクターを認識できず、呼び出し時にコンストラクターが実行されません。

 NewThread t = new NewThread();

publicしたがって、コンストラクターにキーワードを追加するだけで十分だと思います。NewThreadまたは、ThreadDemoクラスを同じパッケージに入れます。

于 2013-01-04T05:45:46.050 に答える
-3
class ThreadDemo {

public static void main(String[] args) {

    NewThread t = new NewThread();

    try {
        for (int i = 5; i > 0; i--) {
            System.out.println("Main Thread: " + i);
            Thread.sleep(1000);
            t.run(); //// forgot here
        }
    } catch (InterruptedException e) {
        // TODO: handle exception
        System.out.println("Main Thread Interrupted.");
    }

    System.out.println("Main Thread Exiting.");
}

}

t.run(); を追加します。

于 2013-01-04T01:56:17.147 に答える