- 进程作为资源分配的基本单位
- 线程作为资源调度的基本单位,是程序的执行单元,执行路径(单线程:一条执行路径,多线程:多条执行路径)。是程序使用CPU的最基本单位。
-
线程有3个基本状态:
- 执行、就绪、阻塞(还有新生,死亡)
线程有5种基本操作:
- 派生、阻塞、激活、 调度、 结束
-
线程有两个基本类型:
- 1) 用户级线程:管理过程全部由用户程序完成,操作系统内核心只对进程进行管理。
- 2) 系统级线程(核心级线程):由操作系统内核进行管理。操作系统内核给应用程序提供相应的系统调用和应用程序接口API,以使用户程序可以创建、执行以及撤消线程。
- 注意:当用户级线程都结束时,jvm虚拟机就会结束,不管保护线程是否还在运行;
-
线程的属性:
- 1)轻型实体;
- 2)独立调度和分派的基本单位;
- 3)可并发执行;
- 4)共享进程资源
- 值得注意的是:多线程的存在,不是提高程序的执行速度。其实是为了提高应用程序的使用率,程序的执行其实都是在抢CPU的资源,CPU的执行权。多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权(注意:有阻塞的出现,才会使用多线程,即在一个线程发生阻塞时,其他线程可以继续使用CPU)
-
通过上面的顶部注释我们就可以发现,创建多线程有两种方法:
- 继承Thread,重写run方法
- 实现Runnable接口,重写run方法
-
Java实现多线程需要注意的细节
不要将
run()
和start()
搞混了~run()和start()方法区别:
run()
:仅仅是封装被线程执行的代码,直接调用是普通方法start()
:首先启动了线程,然后再由jvm去调用该线程的run()方法。
jvm虚拟机的启动是单线程的还是多线程的?
- 是多线程的。不仅仅是启动main线程,还至少会启动垃圾回收线程的,不然谁帮你回收不用的内存~
那么,既然有两种方式实现多线程,我们使用哪一种???
一般我们使用实现Runnable接口
- 可以避免java中的单继承的限制
- 应该将并发运行任务和运行机制解耦,因此我们选择实现Runnable接口这种方式!