62,620
社区成员
发帖
与我相关
我的任务
分享
这个问题就有点难了,就好像问人活着为什么要呼吸,为什么要喝水。
因为Thread的run方法是调用Runnable的run方法的
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
private native void start0();
start0方法用的native关键字,百度了一下,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。
可以再看一下JDK的文档,关于Thread类的start方法的介绍:
public void start()
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
所以我觉得start0方法里应该就是做了让虚拟机调用该线程的 run 方法,也就是Thread类的run方法,也就执行了run方法里的任务
Runnable r=new Runnable(){
public void run() {
while(true){
System.out.println("1111");
}
}
}
Thread t = new Thread(r);
t.start();
或者下面的形式也可以开启一个线程,也就是重写Thread类的run方法:
class First extends Thread{
public void run(){
while(true){
System.out.println("11111111");
}
}
}
public class Test{
public static void main(String []args){
Thread t=new First();
t.start();
}
}
你可以再看一下Thread类的源代码:
private Runnable target;
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
private void init(ThreadGroup g, Runnable target, String name, long stackSize) {
//其它代码
this.target = target;
//其它代码
}
public void run() {
if (target != null) {
target.run();
}
}
所以使用第一种方式开启线程的时候,target就是构造方法传过来的Runnable对象,就会去执行target的run方法,也就是Runnable对象的任务,如果是第二种方式,则执行已经重写过的run方法里的任务