public class FatherAndSon{
bokean flag=true;
public synchronized void father(){
//理当父线程不执行 wait():如果在一个线程 中调用了obj.wait():自己本身进入阻塞状态 并释放对锁的占有(立即释放)
// notify(): 唤醒线程(唤醒的是等待obj锁的线程) 阻塞队列---->Object的方法
if(flag){ //判断此时是子线程还是父线程进行执行,当flag的值是true时,父线程执行
try {
this.wait(); //当子线程进行执行时,通过调用wait方法使父线程阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0;i<5;i++){ //父线程循环执行5次
System.out.println("父线程第"+(i+1)+"次执行");
}
flag=true; //转换flag的值。使父线在执行五次之后进入阻塞状态,不再执行父线程
this.notify(); //通过调用notify方法唤醒正在阻塞的线程
}
//this FatherAndSon son=new FatherAndSon(); 对象是单例的
public synchronized void sub(){
if(!flag){ //判断flag的值,当flag的值是false时,子线程执行
//理当父线程不执行 wait():如果在一个线程 中调用了obj.wait():自己本身进入阻塞状态并释放对锁的占有(立即释放)
// notify(): 唤醒线程(唤醒的是等待obj锁的线程) 阻塞队列---->Object的方法
try {
this.wait(); //调用wait方法,使子线程进入阻塞状态不再执行子线程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0;i<3;i++){ //使子线程循环执行3次
System.out.println("子线程第"+(i+1)+"次执行");
}
flag=false; //重新赋予flag的值,使子线程在执行3次之后进入阻塞状态,释放同步锁,让父线程进行执行
this.notify(); //调用notify方法唤醒阻塞中的线程
}
}
public static void main(String[] args) {
final FatherAndSon fs=new FatherAndSon(); //创建对象调用方法
new Thread(new Runnable() {
//JVM叫本地方法栈
@Override
public void run() {
//子线程的线程体
for (int i=0;i<10;i++)
fs.sub();
}
}).start();
//父线程的线程体
for(int i=0;i<10;i++)
fs.father();
}
}