Thread 和 Runnable 的区别
实际上,Thread也是一个Runnable,它实现了Runnable接口,在Thread类中有一个Runnable类型的target字段,代表要被执行在这个子线程中的任务。
public class Thread implements Runnable //Thread是实现了Runnable接口
{
在此类中有定义
Runnable target; //这是要执行的目标任务
其中有个方法是
//初始化Thread,并且将该Thread对象添加到ThreadGroup中
private void create(ThreadGroup group, Runnable runnable ,String threadName , long stackSize)
{
Thread currentThread = Thread.currentThread();
其中有判断
//group 参数为Null ,则获取当前线程的线程组
if(group == null)
{
group = currentThread.getThreadGroup();
}
//有一些省略的代码
this.group = group ;
this.target = runnable ; //设置target
this.group.addThread(this);
}
另一个方法是
//启动一个新的线程,如果target不为空则执行target的run函数,否则执行当前对象的run方法
public synchronized void start()
{
checkNotStarted();
hasBeenStarted = true;
//调用native函数启动新的线程
nativeCreate(this,stackSize ,daemon);
}
}
实际上最终被线程执行的任务是Runnable,而非Thread。Thread实际上是对Runnable的包装,并且通过一些状态对Thread进行管理与调度。Runnable接口定义了可执行的任务,有一个无返回值的run()函数。
public interface Runnable {
void run();
}
当启动一个线程的时候,如果Thread的target不为空,则会在子线程中执行这个target的run 函数,否则虚拟机就会执行该线程自身的run函数。