以前看过张孝祥老师的视频,讲到一个多线程的例子,是利用wait和notify来实现如下需求,觉得简单又经典,在此缅怀张孝祥老师。
/*
* 子线程先执行10次
* 主线程再执行100次
* 如此循环50次
*/
public class WorkInOrder {
Business busi = new Business();
boolean bShouldSub = true;
public static void main(String[] args) {
WorkInOrder wio = new WorkInOrder();
wio.init();
}
public void init(){
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 50; i++) {
busi.sub();//子线程执行
}
}
}).start();
for (int i = 0; i < 50; i++) {
busi.main();//主线程执行
}
}
class Business{
public synchronized void sub(){
while(!bShouldSub){
try {
/*
* 该方法只能在同步方法或同步块内部调用。如果当前线程不是对象所得持有者,
* 该方法抛出一个java.lang.IllegalMonitorStateException 异常
*/
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 10; i++) {
System.out.println("********子线程执行次数:"+(i+1));
}
bShouldSub = false;
this.notify();
}
public synchronized void main(){
while(bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 0; i < 100; i++) {
System.out.println("========主线程执行次数:"+(i+1));
}
bShouldSub = true;
this.notify();
}
}
}