Java基础加强之并发Thread中start()和run()的区别

Posted 扎心了,老铁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础加强之并发Thread中start()和run()的区别相关的知识,希望对你有一定的参考价值。

Thread中start()和run()的区别

start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。
run()   : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程!

MyThreadTest.java代码

class MyThread extends Thread{
    public void run() {
        System.out.println("线程名:"+Thread.currentThread().getName());
    }
}

public class MyThreadTest {

    public static void main(String[] args) {
        MyThread mythread = new MyThread();
        mythread.start();//运行结果:线程名:Thread-0
        mythread.run();//运行结果:线程名:main
    }

}

结果说明
(01) Thread.currentThread().getName()是用于获取“当前线程”的名字。当前线程是指正在cpu中调度执行的线程。
(02) mythread.run()是在“主线程main”中调用的,该run()方法直接运行在“主线程main”上。
(03) mythread.start()会启动“线程mythread”,“线程mythread”启动之后,会调用run()方法;此时的run()方法是运行在“线程mythread”上。

Thread类中start()方法源码

public synchronized void start() {
    // 如果线程不是"就绪状态",则抛出异常!
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

    // 将线程添加到ThreadGroup中
    group.add(this);

    boolean started = false;
    try {
        // 通过start0()启动线程
        start0();
        // 设置started标记
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
        }
    }
}

说明:start()实际上是通过本地方法start0()启动线程的。而start0()会新运行一个线程,新线程会调用run()方法。

Thread类中run源码

private Runnable target;
public
void run() { if (target != null) { target.run(); } }

说明:target是一个Runnable对象。run()就是直接调用Thread线程的Runnable成员的run()方法,并不会新建一个线程。

 

以上是关于Java基础加强之并发Thread中start()和run()的区别的主要内容,如果未能解决你的问题,请参考以下文章

Java_多线程并发编程基础篇—Thread类中start()和run()方法的区别

Java基础加强之并发基本概念介绍

Java基础加强之并发synchronized关键字

Java并发知识整理

Java基础加强之多线程篇(线程创建与终止互斥通信本地变量)

Java并发编程系列-线程的基本使用