Java多线程Day03-多线程之Thread的start()和run()

start()和run()比较

start()

  • 作用: 启动一个新的线程
  • 新线程会执行相应的run() 方法
  • 同一个线程不能重复调用start() 方法

run()

  • run() 方法就和普通的成员方法一样,可以重复进行调用
  • 调用run() 方法,会在当前线程中执行run() 方法,并不会启动新的线程

示例

class Threads extends Thread {
	public Threads(String threadName) {
		super(name);
	}

	public void run() {
		System.out.println(Thread.currentThread().getName() + "正在运行...");
	}
};

public class ThreadTest {
	public void main(String[] args) {
		Thread thread = new Threads("currentThread");

		System.out.println(Thread.currentThread().getName() + "正在调用start()方法...");
		thread.start();

		System.out.println(Thread.currentThread().getName() + "正在调用run()方法...");
		thread.run();
	}
}
  • Thread.currentThread().getName(): 用于获取当前线程的名称. 当前线程是指正在CPU中调度的线程
  • thread.run(): 是在主线程main() 中调用的,该run() 方法直接运行在主线程main
  • thread.start(): 会启动线程thread. 线程thread启动之后,会调用启动的线程的run() 方法.此时run() 方法是运行在线程thread之上的

Thread中的源码

start()方法源码

  • 执行当前线程,调用线程的run() 方法
	/**
     * 执行当前线程,调用线程的run()方法
     * 结果包含两个线程,一个调用start()方法的线程和一个调用start()方法返回的线程
     * 不允许一个线程重复调用start()方法
     *
     * @exception IllegalThreadStateException 如果线程已经启动则抛出异常
     */
    public synchronized void start() {
        /*
         * main方法以及JVM中System类的方法不会调用此方法
         */
         // 0 - 新建状态new
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        // 通知线程组将要启动该线程,这样该线程可以加入到线程组启动的线程中,并且线程的中未启动的线程数组减1
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                // 不做操作, 如果start0抛出调用异常,将会被传递给调用堆栈
            }
        }
    }
  • start() 方法实际上是通过native方法start0() 启动线程的
  • start0() 会新运行一个线程,新线程会调用run() 方法

run()方法源码

  • Thread中的run() 方法源码:
	/**
     * 如果该线程是使用单独线程构造的 Runnable 运行对象,则调用构造的 Runnable 对象中的 run() 方法
     * 否则,这个方法将直接返回
     * 
     * 相关的子类线程应该重写该 run() 方法
     */
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
  • target是一个Runnable对象
  • run() 方法就是直接Thread线程的Runnable成员的run() 方法,并不会新建一个线程

猜你喜欢

转载自blog.csdn.net/JewaveOxford/article/details/108121558