概念:
程序: 静态的代码
进程: 运行的静态代码需要占用空间,进程存在动态的过程:存在产生,存在和消亡的过程
线程:线程是由进程创建的,是进程的实体
单线程:同一个时刻,只允许执行一个线程
多线程:同一时刻,可以执行多个线程
并发:同一个时刻,多个任务交替执行
并行:同一个时刻,多个任务同时执行
线程的机制:
主线程结束,其他的子线程如果还在存活,子线程并不会死掉,影响服务
子线程中也可以再创建线程
所有的线程都结束的情况下,进程才会挂掉
线程启动的时候为什么调用的是run方法而不是start()方法
run方法就是一个普通方法,是一个串行化的执行
start方法才是执行真正的线程,并不会进行阻塞
native代表java 调用由非java语言实现的功能或者接口
start() 方法调用start0()方法后,该线程不一定会立马执行,只是将线程变成了可运行状态,具体什么时候执行,取决于cpu,由cpu统一调度。
start0是由jvm来调用,jvm不同的操作系统算法是不同的
实现Runable接口方式更加适合多个线程共享一个资源的情况,并且避免了单继承的限制
线程终止:
使用变量控制run方法退出的方式停止线程,即通知方式
线程常用的方法:
setName 设置线程名称
getName 返回线程名称
setPriority 更改线程的优先级
getPriority 获取线程的优先级
interrupt 中断线程 并没有真正的结束线程,所以一般用于中断正在休眠线程 使线程结束休眠
yield:线程的礼让,让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定礼让成功
join: 线程的插队,插队的线程一旦插队成功,则肯定先执行完插入线程的所有任务
用户线程:
工作线程,当线程的任务执行完成或通知方式结束
守护线程: 一般是为工作线程服务的,当所有的用户线程结束
synchronized 同步代码 解决多线程之间的资源抢占问题
synchronized 的原理:
增加一把锁
互斥锁:
每个对象都对应一个称为互斥锁的标记,这个标记用来保证在任一时刻,只能有一个县城访问该对象
线程的生命周期(暂时还不清楚)
同步方法如果没有static 默认锁对象为this 如果方法使用static修饰,默认锁对象:当前类.class
多个线程的锁对象为同一个即可
线程死锁:
线程同步的时候可能出现死锁的情况
ctrl+alt+t