线程的五种基本状态
新建态
new
就绪态
等
cpu
yield
运行态
cpu
同步
阻塞态
sleep
join
wait
synchronized
<英 /'sɪŋkrənaɪzd/ 同步>
死亡态
结束
构造方法:
getState() 返回当前线程对象的状态对象
state<英 /steɪt/ 状态>
state的六种状态简述
- NEW:新建态,没有开启线程
- RUNNABLE:就绪态和运行态
- BLOCKED:阻塞态(等待锁、I\O)
- WAITING:阻塞态(调用了wait方法,等待其他线程唤醒的状态)
- TIMED_WAITING:阻塞态(调用了有时间限制的wait方法、sleep方法)
- TERMINATED:死亡态
主线程
定义:main方法对应的线程
特点:
- 它是产生其他子线程的线程
- 不一定最后运行
. 比如子进程处于TIMED_WAITING:阻塞态 ----sleep
停止线程的方式
目前主流是定义标识停止
stop方法()过时了,将来可能随时剔除
定义标识比如在实现类中+
private boolean flag = true;
运行到一定过程重写定义flag为true,然后break
注意 :若处于冻结状态,则不能判断标记
解决方法:interrupt方法中断
interrupt是将线程的冻结状态清除,让线程恢复到就绪态
异常时常发生,通过catch可以捕获异常,在异常处理中,改变标记让循环结束,让run方法结束
线程的优先级
线程优先级分为10级,默认为5,最高是10 ,最低是1
常用类常量
- Thread.MAX_PRIORITY = 10
- Thread.NORM_PRIORITY = 5
- Thread.MIN_PRIORITY = 1
结构方法:
getPriority() 当前线程对象的优先级
setPriority(int newPriority 设置线程的优先级
Thread.currentThread().setPriority(10) 设置线程优先级为10
join方法
非静态方法,当前线程挂起(阻塞)等待加入的线程执行完成。然后就绪态
yield方法
短暂地挂起当前线程,让别的线程先运行,cpu充足不明显
守护线程方法 又 后台线程
比如:gc这种垃圾回收线程
特点
- 守护线程只有在别的线程运行的时候才有意义
- 前台线程结束,后台也要结束,(后台是在一段时间内结束,并不会立即结束)
实现方法
setDaemon(boolean on) 前提条件: 程序启动前调用有效
Daemon<英 /ˈdiːmən/> 守护进程;后台程序
线程安全
定义:一个程序对象被多个线程同时运行,每个线程得出的结果一样其他也一样,这就是线程安全
另一种若每个线程中对元素只读不写,这个元素也是安全的;
若有多个线程同时读写,每个线程结果不同步,这种是线程不安全
线程同步
作用:
线程同步可以解决资源安全问题
关键字
synchronized
synchronized<英 /'sɪŋkrənaɪzd/ 同步>
synchronized的使用方法:
- 同步代码块。
synchronized(同步锁){
需要同步操作的代码
}
- 同步方法
public synchronized void method(){
可能会产生线程安全问题的代码
}
- lock锁机制
Lock锁比synchronized代码块和synchronized方法的功能更强大;
构造方法
lock()
:加同步锁
unlock()
:释放同步锁。
死锁
互相等待对方资源,称之为死锁
最典型的死锁:线程1持有ObjectA上的锁,并等待ObjectB上的锁,线程2持有ObjectB上的锁,并等待ObjectA上的锁,每个线程都不放弃获得的第一个锁,并一直等待第二个锁,因此会永远等下去。