Java多线程系列-start和run方法的区别


  • start()和run()是Thread类里面的两个方法。
    学过的都知道,我们创建了一个线程类,通过调用start()方法来启动线程,并且该线程会执行内部的run()方法,那么我们可以直接调用run()方法吗。
    答案显而易见,当然是可以啊,可是前后两者还是有本质的区别的。

start()run()

  • 调用start()方法,会创建一个新的线程,而这个新的线程会执行Thread类中的run方法
  • 调用run()方法,不会创建新的线程,而是直接在当前的线程执行该方法。

以上就是这两个方法的本质区别,并且大多数情况下,直接调用run()是错误的。

public class StartAndRunTest {

    private static class MyThread extends Thread{

        private String name;

        public MyThread(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            System.out.println(name+" is running in "+Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {
        MyThread m1=new MyThread("m1");
        MyThread m2=new MyThread("m2");

        m1.start();
        m2.run();
    }

}
/*
m2 running in main
m1 running in Thread-0
*/

上面的例子你可以看到,调用start的Thread类在新的线程上执行run方法,而直接调用run方法的则是在当前main线程执行run方法。
(一个线程不能重复start(),具体可以看内部实现)