start()方法和run()方法

一、start()方法

1、start()方法含义

1、启动新线程。当我们执行了start()方法之后这个线程不一定会立刻执行,其实是在告诉jvm中的线程调度器在合适的时间去启动。例如:我们可能会创建两个线程,分别是线程1和线程2,但线程1先调用start()方法,线程2后调用,缺发现线程2先执行,这其实是不违背启动顺序的。也就是说调用start()方法的顺序并不能决定执行的顺序。

2、一个start()方法牵扯到两个线程:新的线程和原来的主线程。

2、 不能重复的执行start()方法

package threadcoreknowledge.startthread;

/**
 * 描述:     演示不能两次调用start方法,否则会报错
 */
public class CantStartTwice {
    public static void main(String[] args) {
        Thread thread = new Thread();
        thread.start();
        thread.start();
    }
}

非法的线程状态
在这里插入图片描述

3、start()源码解析

启动新线程检查线程状态
在这里插入图片描述
在这里插入图片描述
加入线程组 , 调用start0()
在这里插入图片描述

二、run()方法原理解读

源码在Thread.java中的746行左右。

 /**
     * If this thread was constructed using a separate
     * <code>Runnable</code> run object, then that
     * <code>Runnable</code> object's <code>run</code> method is called;
     * otherwise, this method does nothing and returns.
     * <p>
     * Subclasses of <code>Thread</code> should override this method.
     *
     * @see     #start()
     * @see     #stop()
     * @see     #Thread(ThreadGroup, Runnable, String)
     */
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }

可以看到run()方法就是一个普普通通的方法,和我们自己写的普通方法没有区别,所以要想启动线程,不能调用run()方法,来间接的调用run()方法。

常见面试题

在这里插入图片描述
答:会抛出异常,在start()方法最开始的时候就会对当前状态进行检查,如果不符合规定,也就是说已经执行了start()方法,就会抛出异常。
在这里插入图片描述
答:调用start()方法才是真正意义上的启动线程,它会去经历线程的各个生命周期。而如果调用run方法,它就是一个普通方法,也不会去用子线程去调用。

发布了139 篇原创文章 · 获赞 404 · 访问量 223万+

猜你喜欢

转载自blog.csdn.net/qq_43229543/article/details/105167591