当run()方法在java线程中执行?

时间:2013-07-25 07:20:43

标签: java multithreading

我有一个简单的线程测试:

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 个答案:

答案 0 :(得分:8)

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

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

  

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

     

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

     

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

建议阅读:

  1. Why we call Thread.start() method which in turns calls run method?
  2. Oracle tutorial
  3. Why is run() not immediately called when start() called on a thread object in java

答案 1 :(得分:1)

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

From Documentation

  

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

答案 2 :(得分:1)

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

Main process terminated
9:4905
8:4950

可能以任何顺序出现。

答案 3 :(得分:0)

线程调度程序正在选择要运行的线程。如果您没有给予thraed任何优先权,它可以是随机选择。 这里线程调度程序将选择线程,它将作为两个独立的线程进程在两个独立的堆栈空间中工作。因此线程T1在线程T2之前开始并且没有睡眠,没有等待,没有连接,两者将同时给出输出。

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

如果你使用Thread的其余功能,如sleep(),join(),wait()等,你可以更清楚地理解它。