package Thread;
/**
* 创建子父线程 保证一件事 子线程执行三次后 父线程执行5次 循环10次
* 父线程main线程则为Console台项目的主线程
* 在main线程中调用了start线程则为子线程
*
*/
public class FatherAndSonTest {
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();
}
}
}
package Thread;
public class FatherAndSon {
/**
* 匿名内部类:并不是说接口一定不可用被new
* 为何这两个方法都必须是同步方法 这两个方法所使用的同步锁都为this?
* 谁又是this: 谁调用father|son 谁就是this
* this 子线程--->父--->子--->父
* 子 父
* 子 子
* 父 子
* 父 父
*/
boolean flag = true;//开关 为true时 子线程执行 为false时 父线程执行
// 什么时候回释放锁? wait|方法执行结束
public synchronized void father(){
if(flag){
//理当父线程不执行 wait():如果在一个线程 中调用了obj.wait():
//自己本身进入阻塞状态并释放对锁的占有(立即释放);
// notify():唤醒线程(唤醒的是等待obj锁的线程)阻塞队列---->Object 方法
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 5; i++) {
System.out.println("父线程第"+(i+1)+"次执行");
}
flag=true;
this.notify();
}
//this FatherAndSon son = new FatherAndSon();对象是单例的
public synchronized void sub(){
if(!flag){
//理当父线程不执行 wait():如果在一个线程 中调用了obj.wait():自己本身进入阻塞状态
//并释放对锁的占有(立即释放)
//notify():唤醒线程(唤醒的是等待obj锁的线程)阻塞队列--->Object的方法
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 3; i++) {
System.out.println("子线程第"+(i+1)+"次执行");
}
flag= false;
this.notify();
}
}