package com.czbk.thread;
/**
* Created by chengtao on 17/12/3.
* 需求: 子线程先运行10次,然后主线程运行 100次,依次运行50次
*
wait(): 等待 如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒。
notify(): 唤醒 唤醒线程池等待线程其中的一个。
notifyAll() : 唤醒线程池所有等待 线程。
wait与notify方法要注意的事项:
1. wait方法与notify方法是属于Object对象 的。
2. wait方法与notify方法必须要在同步代码块或者是同步函数中才能 使用。不在同步代码里执行,会报错
3. wait方法与notify方法必需要由锁对象调用。
wait():一个线程如果执行了wait方法,那么改线程就会进入一个以锁对象为标识符的线程池中等待。
此时 线程释放了锁,进入“临时阻塞”状态,并在其他线程调用notify方法才能将其唤醒,
唤醒后的该线程是“可 运行”状态,获得到cpu后即可执行。
Notify():如果一个线程执行notify方法,那么就会唤醒以锁对象为标识符的线程池中等待线程中的其中一个。
锁对象是Object 对象;
只有同步代码块或同步方法中才有锁;
线程池是以锁为标识符建立的
*/
import java.util.concurrent.atomic.AtomicInteger;
public class Thread04_TraditionalThread_Communication {
public static void main(String[] args) {
final Business business = new Business();
new Thread(
new Runnable() {
public void run() {
for(int i=1;i<=50;i++){
business.sub(i);
}
}
}
).start();
for(int i=1;i<=50;i++){
business.main(i);
}
}
}
class Business {
private boolean bShouldSub = true;
public synchronized void sub(int i){
while(!bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<=10;j++){
System.out.println("sub thread sequence of " + j + ",loop of " + i);
}
bShouldSub = false;
this.notify();
}
public synchronized void main(int i){
while(bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<=100;j++){
System.out.println("main thread sequence of " + j + ",loop of " + i);
}
bShouldSub = true;
this.notify();
}
}