1、线程状态
计时等待状态
锁阻塞状态
无限等待状态(调用wait方法等待,等notify方法唤醒)
2、睡眠和唤醒的代码实现
/**
* 等待唤醒机制:线程之间的通信
* 模拟顾客和老板之间的交易过程
* 创建一个顾客线程,告知老板要的包子种类,然后等待唤醒
* 老板花五秒完成
*
*注意:
* 顾客和老板线程必须使用同步代码块,保证等待和唤醒只有一个执行
* 同步用的锁对象必须唯一
* 只有锁对象才能调用wait和notify方法
*
* void wait(); 等待
* void notify(); 唤醒对象监视器上等待的某个线程,会继续执行wait之后的代码
*
*
*/
具体代码如下
public class Demo1WaitAndNotify {
public static void main(String[] args) {
//创建锁对象
Object obj = new Object();
//使用匿名对象的方式创建顾客线程
new Thread(){
@Override
public void run() {
//保证等待和唤醒只能有一个执行,需要同步
synchronized (obj){
System.out.println("告知要求");
//调用wait,进入等待,wait有异常,要使用trycatch
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("唤醒完成");
}
}
}.start();
//创建老板线程
new Thread(){
@Override
public void run() {
//睡5秒
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj){
System.out.println("老板五秒完成,告知顾客");
//唤醒顾客线程
obj.notify();
}
}
}.start();
}
}
3、线程通信机制
概念:多个线程处理同一资源,但是操作不同。此时需要线程间的通信来确定执行的顺序
意义:多线程并发时,CPU是随机切换进程的,当我们需要多个线程共同完成一件任务且需要各线程有规律执行时,就需要线程通信
4、等待与唤醒机制
wait和notify要由同一个锁对象调用
wait和notify必须在同步代码块或同步方法中使用