一,基础
(一)什么是线程,什么是进程
1,进程是一个应用程序
2,线程是一个进程中的执行场景/致辞那个单元,一个进程可以启动多个线程
(二)对于java程序莱索,当一个dos窗口命令输入:java hello回车后
1,会启动JVM,JVM是一个进程
2,JVM会先启动一个主线程调用main方法
3,同时启动一个垃圾会后器,负责看护
4,java程序至少会有两个线程并发
(三)进程和线程的关系
1,如果进程是公司那么线程就是公司中某个员工
2,进程之间内存不共享
3,线程之间堆内存和方法区内存共享,但是一个线程一个栈。
4,java中间之所以有多线程机制,目的就是为了提高程序的处理效率。
(四)使用多线程之后,main方法结束,是不是还有可能程序也不会结束?
main方法结束只是主线程结束了,主栈空了,其他的栈还有可能在压栈弹栈
二,进阶
(一)对于单核的CPU来说可以真正的多线程并发吗?
1,不是
2,他不是真正的并发,但是可以给人一种并发的感觉。单核的cpu在一个时间点只能执行一个任务。是多线程之间的频繁切换
3,对于多核来说才是真正的多线程并发
(二)线程的实现。
1,方法一 编写一个类,直接继承Thread,重写run方法
然后再main当中创建类,并通过类名调用start方法
start方法的作用是 启动一个分支线程,在JVM中开辟一块新的栈空间
只要新的栈空间开辟出来这个方法就结束了,线程就启动成功了,启动成功的线程会自动调用run方法,并且run放在栈的底层
run方法在分支栈的作用和main差不多,他们是平级的
直接调用run方法是不会启动线程的
2,方法二,编写一个类,实现runnable接口,实现run方法
问题,为什么选则第二种方法实现runnable接口的方法更好
1,面向接口编程
2,Thread有局限性,实现了Thread就没办法继承别的类(只能继承一个,却能实现多个接口)
(三)线程的生命周期
1,线程在就绪和运行两个状态之间频繁切换
2,状态 新建状态
就绪状态
运行状态
阻塞状态
死亡状态
3,生命周期图