1.进程 : 进程是一个 应用程序。 (.exe程序)
线程: 线程是一个进程中的执行场景/执行单元。
一个进程可以启动多个线程。
2. 运行java程序时,会先启动JVM,而JVM就是一个进程。JVM会启动一个主线程调用main方法,再启动一个垃圾回收线程负责看护,回收垃圾。所以一个java程序至少会有两个线程并发。
一个是垃圾回收线程,一个是执行main方法的主线程。
3.进程和线程是什么关系?
阿里巴巴 --- 进程
马云----线程
童文红---线程
京东 ---- 进程
强东 ----线程
妹妹----线程
进程A和进程B 的内存独立不共享(阿里巴巴和京东的资源不共享)
线程A和线程B(同一进程)堆内存和方法区内存共享,但是栈内存独立,一个线程一个栈。
JVM内存分布如下图(一个进程==一个JVM)
假设启动10个线程,会有10个栈空间,每个栈之间,互不干扰,各自执行各自的,这就是多线程并发。可以提高效率。
4.思考:
使用了多线程机制之后,main()方法结束后,程序未必结束,因为main()方法结束了只能说主线程结束了,主栈空了。其它的栈可能还在压栈弹栈。
5.
6. 对于单核的CPU来说,真的可以做到真正的多线程并发嘛?(对于多核来说,可以做到)
什么是真正的多线程并发?t1线程执行t1的,t2线程执行t2的,互不影响。
单核CPU表示只有一个大脑 : 不能做到真正的多线程并发,但是可以做到一种“多线程并发”的感觉
对于单核CPU来说,在某个时间点上实际上只能处理一件事情,但是由于CPU的处理速度很快,多个线程之间频繁切换执行,给人的感觉是:多个事情同时在做。
7. 下面的程序除了垃圾回收外,只有一个线程。
压栈,弹栈的过程了然于目。
8. 实现线程的方式
1)编写一个类,直接继承 java.lang.Thread ,重写run()方法。
(1)如何创建分支线程对象?new就行了
(2)如何启动分支线程?调用start方法
(3)start()方法的作用:
启动一个分支线程,在JVM中开辟一个新的栈空间,这段代码任务完成之后,瞬间就结束了。
这段代码的任务只是为了开启一个新的栈空间,只要新的栈空间开出来,start()方法就结束了。分支线程就启动成功了。
启动成功的线程会自动调用run()方法,并且run()方法在分支栈的栈底。
run方法在分支栈的底部,main方法在主栈底部。二者平级。
(4)思考:不调用start方法,直接调用run方法。
此操作不会产生分支线程(即单线程)
(5)直接调run()
(6) 调用start()
2)编写一个类,实现java.lang.Runnable 接口
3) 采用 匿名内部类
相当于 new 匿名 implements Runnable
9. 线程的生命周期
新建状态 就绪状态 运行状态 阻塞状态 死亡状态
堵塞时间:比如说 sleep() , scanner 输入



