《Java多线程编程核心技术(第2版)》 —1.2.7 实现Runnable接口与继承Thread类的内部流程

举报
华章计算机 发表于 2020/02/08 13:44:05 2020/02/08
【摘要】 本节书摘来自华章计算机《Java多线程编程核心技术(第2版)》 一书中第1章,第1.2.7节,作者是高洪岩。

1.2.7 实现Runnable接口与继承Thread类的内部流程

使用如下代码以实现Runnable接口法启动一个线程的执行过程和在前面章节使用继承Thread类启动一个线程时的执行过程是不一样的:

MyRunnable run = new MyRunnable();

Thread t = new Thread(run);

t.start();

JVM直接调用的是Thread.java类的run()方法,该方法源代码如下:

@Override

public void run() {

    if (target != null) {

        target.run();

    }

}

在方法中判断target变量是否为null,不为null则执行target对象的run()方法,target存储的对象就是前面声明的MyRunnable run对象,对Thread构造方法传入Runnable对象,再结合if判断就可以执行Runnable对象的run()方法了。变量target是在init()方法中进行赋值初始化的,核心源代码如下:

private void init(ThreadGroup g, Runnable target, String name,

             long stackSize, AccessControlContext acc,

             boolean inheritThreadLocals) {

    ……

    this.target = target;

    ……

}

而方法init()是在Thread.java构造方法中被调用的,源代码如下:

public Thread(Runnable target) {

    init(null, target, "Thread-" + nextThreadNum(), 0);

}

通过分析JDK源代码可以发现,实现Runnable接口法在执行过程上相比继承Thread类法稍微复杂一些。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。