美文网首页多线程
一文读懂Thread与Runnable的关系

一文读懂Thread与Runnable的关系

作者: 曾泽浩 | 来源:发表于2018-09-27 14:30 被阅读0次

    本文是笔者对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()方法的代码仍在线程去执行。

    相关文章

      网友评论

        本文标题:一文读懂Thread与Runnable的关系

        本文链接:https://www.haomeiwen.com/subject/bhyeoftx.html