多线程
基本概念
程序(program)
- 为了完成特定任务、用某种语言编写的一组
指令的集合
。即一段静态的代码
,静态对象
。
进程(process)
程序
的一次执行过程
,或者是正在运行的一个程序
,是动态过程。动态过程:有自身的产生、存在和消亡的过程。
程序是静态的,而进程是动态的
。
线程(thread)
进程
可以进一步细化为线程
,是一个程序
内部的一条执行路径
。若一个程序可
同一时间
执行多个线程,那么这个程序就支持多线程。
Java中的线程
- Java线程是依附于Java虚拟机中的本地线程来运行的,实际上是本地线程在执行Java线程代码,只有本地线程才是真正的线程实体。
- Java代码中创建一个thread,虚拟机在运行期就会创建一个对应的本地线程,而这个本地线程才是真正的线程实体
多线程的用处
- 发挥多核CPU的优势,大大提高效率
- 防止多余的阻塞
- 单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率 ,但是单核CPU我们还是要应用多线程,就是为了防止阻塞 。
- 多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行
- 方便进行业务拆分,提升应用性能
时间片
- 时间片是CPU调度给各个线程的时间。
并行和并发
- 并行:多个任务
同时进行
,必须有多核CPU
的支持 - 并发:指多个任务都请求运行,而处理器只能接受一个任务,就是把多个任务
轮流进行
,由于轮转时间间隔过短
,让人感觉
是多个任务都在同时运行。
同步和异步
- 同步和异步通常用来形容一次方法调用。
- 同步方法调用一开始,调用者必须等待被调用的方法执行结束后,才能执行后面的代码。
- 异步方法调用后,调用者不用理会调用方法是否执行完毕,都会继续执行后面的代码,当被调用的方法完成之后会通知调用者。
临界区
- 临界区表示一种
公共资源,共享数据
,可以被多个线程使用。 - 一旦临界区资源
被一个线程占用时
,其他线程必须等待其使用完毕
后才能使用。
阻塞和非阻塞
- 阻塞和非阻塞通常用来形容
多线程之间
的相互影响。 - 当一个线程
占用了临界区资源
,那么其他线程
需要这个资源就必须等待
该资源
被那个线程释放
,这就会导致等待的线程挂起
,这种情况就是阻塞。 - 非阻塞强调没有一个线程可以阻塞到其他线程,所有的线程都会尝试地往前运行。和阻塞正好相反。
问题引入
Java程序的运行原理?
- Java命令会启动Java虚拟机,启动JVM,等于启动了一个应用程序,也就是启动了一个进程。这个进程会自动的启动一个
主线程
,然后主线程调用类中的main方法
。 - 实际上java程序天生就是一个多线程程序,包含了:
- (1)分发处理发送给给JVM信号的线程
- (2)调用对象的finalize方法的线程
- (3)清除Reference的线程;
- (4)main线程,用户程序的入口
- Java命令会启动Java虚拟机,启动JVM,等于启动了一个应用程序,也就是启动了一个进程。这个进程会自动的启动一个
JVM的启动是多线程吗?
JVM的启动
至少启动
了主线程
和垃圾回收线程
,所以是多线程的。