start和run的区别
run执行的是函数体内容,并没有真正创建线程,star()才创建了线程,并回调了run()方法
public class test extends Thread{ @Override public void run(){ System.out.println(Thread.currentThread().getName()+"开始学习"); } public static void main(String[] args) { for (int i = 0; i < 5; i++) { test test = new test(); test.start(); System.out.println("main线程"); } } }
执行结果:
main线程
main线程
Thread-0开始学习
main线程
main线程
Thread-1开始学习
main线程
Thread-2开始学习
Thread-3开始学习
main线程
Thread-4开始学习
public class test extends Thread{ @Override public void run(){ System.out.println(Thread.currentThread().getName()+"开始学习"); } public static void main(String[] args) { for (int i = 0; i < 5; i++) { test test = new test(); test.run(); System.out.println("main线程"); } } }
执行结果:
main开始学习
main线程
main开始学习
main线程
main开始学习
main线程
main开始学习
main线程
main开始学习
main线程
可以看到并没有真正创建线程,并且是以同步的方式运行(即严格按照代码顺序执行)。
start在Thread类中的源码:
public synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group threads created/set up by the VM. Any new functionality added * to this method in the future may have to also be added to the VM. * * A zero status value corresponds to state "NEW". */ if (threadStatus != 0) throw new IllegalThreadStateException(); /* Notify the group that this thread is about to be started * so that it can be added to the group's list of threads * and the group's unstarted count can be decremented. */ group.add(this); boolean started = false; try { start0()//start0()真正启动了一个线程 started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { /* do nothing. If start0 threw a Throwable then it will be passed up the call stack */ } } }