线程的生命周期
- new() 出生
- start() 就绪 等待CPU调度
- Running 运行
- wait() 等待
- sleep() 休眠
- IO请求阻塞
- stop() 死亡
线程的优先级和线程的调度
- 优先级
类型 | 名称 | 说明 |
---|---|---|
static int | MAX_PRIORITY | 最大优先级为10 |
static int | MIN_PRIORITY | 最小优先级为1 |
static int | NORM_PRIORITY | 默认优先级5 |
void | setPriority(int newPriority) | 设置优先级1~10 |
线程的优先级只代表,该线程获得CPU调度的概率,是个概率事件,不一定优先级大的就一定先获得CPU的执行
什么是守护线程
setDaemon() //守护线程,就是主线程结束他就结束
- 线程的调度
正在执行的线程调用yield方法,使其他线程有获得CPU执行的机会
- 多线程的实现
- 继承Thread类,重写run()方法
- 实现Runnable接口,实现run()方法 (推荐做法)
class MyThread1 extends Thread{
public void run(){}
}
class MyThread2 implements Runnable{
public void run(){}
}
//启动多线程
MyThread1 t1 = new MyThread1();
t1.start();
Thread t2 = new Thread(new MyThread2());
t2.start();
线程的终止
- 已经停止使用stop() suspend()方法
public void run(){
while(true){
doSomeWork();
if(flag){ //flag为外部的某些条件,满足的时候停止执行
break;
}
}
}
public void run(){
while(!flag){ //flag为外部的某些条件,满足的时候停止执行
doSomeWork();
}
}
线程的同步
- 线程之间的一种制约关系
- 线程的互斥是指,访问共享资源时,单个线程的排他性
- 同步方法
public synchronized 返回值类型 方法名(){
}
- 同步块
synchronized(互斥对象){
}
wait(); 使线程进入阻塞状态,释放锁
notify(); 使线程进入可运行状态
//通过类的监视器实现
-
每个类都有一个监视器 (monitor)
- 可以理解为是一个房间的所有墙
线程之间的通信
- 可以理解为是一个房间的所有墙
graph LR
a[PipedWriter/PipedOutputStream]-->b[管道]
b-->c[PipedReader/PipedOutputStream]
- 管道是单向的
- 实现两个线程之间的通信必须建立两条管道
- 传输的数据的顺序是严格且有顺序的,接收方接受到的顺序和发送方发送的顺序是一致的
死锁问题
- 经典的哲学家问题