-2

スレッドを使用した簡単なテストがあります:

package Thread;

class Sum extends Thread {
    int low, up, S;

    public Sum(int a, int b) {
        low = a;
        up = b;
        S = 0;
        System.out.println("This is Thread " + this.getId());
    }

    @Override
    public void run() {
        for (int i = low; i < up; i++) {
            S += i;
        }
        System.out.println(this.getId() + ":" + S);
    }
}

public class Tester {
    public static void main(String agrs[]) {
        Sum T1 = new Sum(1, 100);
        T1.start();
        Sum T2 = new Sum(10, 100);
        T2.start();
        System.out.println("Main process terminated");
    }
}

しかし、いつrun()メソッドが実行されたのかわかりません。同じものを返します:

This is Thread 8
This is Thread 9
Main process terminated
9:4905
8:4950

これは、T1 と T2 の開始後に run() メソッドが実行されたことを意味します。start() メソッドが呼び出されたときに run() が実行されると私はまだ考えています。よろしくお願いします!

4

4 に答える 4

1

メソッドは、メソッドstart()を実行する新しいスレッドを作成しますrun()

ドキュメントから

このスレッドに実行を開始させます。Java 仮想マシンは、このスレッドの run メソッドを呼び出します。

于 2013-07-25T07:24:37.523 に答える
0

スレッド スケジューラは、実行するスレッドを選択しています。スレッドに優先順位を付けていない場合は、ランダムに選択できます。ここで、スレッド スケジューラはスレッドを選択し、2 つの独立したスレッド プロセスとして 2 つの個別のスタック空間で動作します。したがって、スレッド T1 はスレッド T2 の前に開始し、スリープも待機も結合もありません。両方が同時に出力を提供します。

詳細については、 http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#start%28%29をご覧ください。

sleep()、join()、wait()などのThreadの残りの機能を使用すると、より明確に理解できます...

于 2013-07-25T07:31:16.010 に答える