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(),具体可以看内部实现)