我有一个简单的线程测试:
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()将被执行。感谢提前!
答案 0 :(得分:8)
当您在线程对象上调用start()
时,它会调用run()
方法。
如有疑问,请阅读documentation: Thread#start():
导致该线程开始执行; Java虚拟机调用此线程的run方法。
结果是两个线程并发运行:当前线程(从调用start方法返回)和另一个线程(执行其run方法)。
多次启动线程永远不合法。特别是,一旦完成执行,线程可能无法重新启动。
建议阅读:
答案 1 :(得分:1)
答案 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()等,你可以更清楚地理解它。