一文读懂Thread与Runnable的关系
本文是笔者对Thread与Runnable的理解,如有理解错误的地方,欢迎大家指正。
Thread是线程,Runnable是线程执行体。
在Java中,用来创建线程的方法只有一种,就是new Thread()(通过反射创建咱不讨论),用来启动线程的方法也只有一个,就是start()方法。
通常,一个类实现Runnable接口,并且实现run(),但这个类不能说是一个线程类。
那为什么Runnable接口会跟Thread挂钩在一起呢?Runnable接口的run()方法何时会执行呢?
在Thread类,有这样一个构造函数
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
通过init()初始化的方法会把Runnable赋值给成员变量target.
public synchronized void start() ;
start()方法用来启动一个线程,里面有个方法start0(),真正启动线程的方法。
private native void start0();
Causes this thread to begin execution; the Java Virtual Machine calls the <code>run</code> method of this thread.
这段是start()方法上面的注释,也就是说在执行start()方法的同时,会去执行run()方法。
@Override
public void run() {
if (target != null) {
target.run();
}
}
target就是在新建Thread传进去的Runnable类,也就是说实现Runnable接口的类,通过
Thread(Runnable target)创建线程,在启动线程start()启动的时候,会调用run()方法。
The result is that two threads are running concurrently: the current thread (which returns from the call to the <code>start</code> method) and the other thread (which executes its <code>run</code> method).
这段话也是start()方面上面的注释,翻译一下,当前线程会去调用start(), 然后被创建的线程会去执行run()方法。
Runnable接口真的是仅仅是一个接口,它并不是一个线程,不能用来启动线程,真正执行线程的还是Thread。Runnable字面意思也就是可执行的,我的理解是Runnable接口用来定义可以给线程执行的东西,也就是把run()方法的代码仍在线程去执行。