线程进行的机制
在我们运行一个进程的时候,会出现主线程和子线程,主线程并不会因为子线程的运行而发生阻塞。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
public class Test { public static void main(String[] args) { Cat cat = new Cat(); cat.start(); for (int i=0;i<100;i++){ System.out.println("我是主线程"); try{ Thread.sleep(1000);}catch (Exception e){ System.out.println("线程发生异常"); } } } }
class Cat extends Thread{ int time=0; @Override public void run(){ while (true){ System.out.println("喵喵,我是小喵咪"); time++; try{ Thread.sleep(1000);}catch (Exception e){ System.out.println("发生了错误"); } if (time==20){ break; } } } }
|
运行以上程序,可以发现主线程的for循环并没有因为子线程cat的运行而进行停滞,而是不断的交替运行。
为什么使用Start
使用我们cat.run方法也可以调用这个方法,但是为什么使用start方法??
如果我们直接调用Run方法,会发现控制他的线程是main方法,而不是我们的Thread-0线程,这样的就不会交替执行,而是必须将方法执行完毕才可以执行下一个方法。这样就是串行化执行,而不是多线程。
1 2 3 4 5 6 7 8 9 10 11 12 13
| public void run(){ while (true){ System.out.println("喵喵,我是小喵咪"); System.out.println(Thread.currentThread().getName()); time++; try{ Thread.sleep(1000);}catch (Exception e){ System.out.println("发生了错误"); } if (time==20){ break; } }
|
Start源码
他的底层调用了start0方法,但是start0方法是一个native方法,由jvm底层进行调用,而不是由我们程序员进行调用
在start方法调用start0方法之后,线程并不是立刻执行,而是进入了可执行的状态,而最终的运行是由cpu统一进行调度。