-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

这意味着 run() 方法是在 T1 和 T2 启动之后执行的。我仍然认为当 start() 方法被调用时 run() 将被执行。感谢提前!

4

4 回答 4

8

当您调用start()线程对象时,它会调用该run()方法。

如有疑问,请阅读文档:Thread#start()

导致该线程开始执行;Java 虚拟机调用该线程的 run 方法。

结果是两个线程同时运行:当前线程(从对 start 方法的调用返回)和另一个线程(执行其 run 方法)。

多次启动线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。

推荐阅读:

  1. 为什么我们调用 Thread.start() 方法,而后者又调用 run 方法?
  2. 甲骨文教程
  3. java - 为什么在java中的线程对象上调用start()时没有立即调用run()
于 2013-07-25T07:22:16.473 回答
1

start()方法创建一个执行该run()方法的新线程。

从文档

使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

于 2013-07-25T07:24:37.523 回答
1

当我们调用 Thread.start 时,JVM 会创建一个新的本地线程,然后调用 Thread.run,这会导致该线程开始执行。JVM异步调用Thread.run,所以这3行

Main process terminated
9:4905
8:4950

可能以任何顺序出现。

于 2013-07-25T07:26:59.737 回答
0

线程调度程序正在选择运行哪个线程。如果您没有为线程提供任何优先级,则可以是随机选择。在这里,线程调度程序将选择线程,它将作为两个独立的线程进程在两个独立的堆栈空间中工作。所以线程 T1 在线程 T2 之前启动,没有睡眠,没有等待,没有加入,两者都会同时给出输出。

有关详细信息,请访问http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#start%28%29

如果你使用 Thread 的剩余函数,如 sleep()、join()、wait() 等,你可以更清楚地理解它...

于 2013-07-25T07:31:16.010 回答