1、使用notifyAll(),唤醒其他所有的等待线程,notify()只能随机唤醒一个等待线程。
2、判断标记的时候注意要使用while,if语句是在哪里等待,就在哪里起来不再执行if里面的判断,而while循环是循环判断,每次都会执行判断标记。
实例;三个线程轮流执行
package com.heima.day25;
public class Demo005 {
public static void main(String[] args) {
Print2 print = new Print2();
new Thread(){
public void run() {
for(int i=1;i<=100;i++){
try {
print.print1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
new Thread(){
public void run() {
for(int i=1;i<=100;i++){
try {
print.print2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
new Thread(){
public void run() {
for(int i=1;i<=100;i++){
try {
print.print3();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
}
}
/*1,在同步代码块中,用哪个对象锁,就用哪个对象调用wait方法
* 2,为什么wait方法和notify方法定义在Object这类中?
* 因为锁对象可以是任意对象,Object是所有的类的基类,所以wait方法和notify方法需要定义在Object这个类中
* 3,sleep方法和wait方法的区别?
* a,sleep方法必须传入参数,参数就是时间,时间到了自动醒来
* wait方法可以传入参数也可以不传入参数,传入参数就是在参数的时间结束后等待,不传入参数就是直接等待
* b,sleep方法在同步函数或同步代码块中,不释放锁,睡着了也抱着锁睡
* wait方法在同步函数或者同步代码块中,释放锁
*/
class Print2{
private int flag = 1;
Object obj = new Object();
public void print1() throws InterruptedException{
synchronized (obj) {
/*
* 线程1在此等待,if语句是在哪里等待,就在哪里起来
* while循环是循环判断,每次都会判断标记
*/
while(flag!=1){
obj.wait();
}
System.out.print("黑");
System.out.print("马");
System.out.print("程");
System.out.print("序");
System.out.print("员");
System.out.print("\r\n");
flag = 2;
obj.notifyAll();
System.out.println(Thread.currentThread().getName());
}
}
public void print2() throws InterruptedException{
synchronized (obj) {
while(flag != 2){
obj.wait();
}
System.out.print("传");
System.out.print("智");
System.out.print("播");
System.out.print("客");
System.out.print("\r\n");
flag = 3;
obj.notifyAll();
System.out.println(Thread.currentThread().getName());
}
}
public void print3() throws InterruptedException{
synchronized (obj) {
while(flag != 3){
obj.wait();
}
System.out.print("i");
System.out.print("t");
System.out.print("h");
System.out.print("e");
System.out.print("i");
System.out.print("m");
System.out.print("a");
System.out.print("\r\n");
flag = 1;
obj.notifyAll();
System.out.println(Thread.currentThread().getName());
}
}
}