public class AlternationRun {
public static void main(String[] args) {
// TODO Auto-generated method stub
final Business b = new Business();
new Thread(new Runnable(){
public void run(){
for(int i=0;i<50;i++){
b.sub(i);
}
}
}).start();
for(int i=0;i<50;i++){
b.main(i);
}
}
static class Business{
private boolean isShouldSub = true;//alternate run
public synchronized void sub(int i){
while(!isShouldSub){//while is better than if,source code
// if(!isShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=0;j<10;j++){
System.out.println("sub thread number " + j + " of " + i);
}
isShouldSub = false;
this.notify();
}
public synchronized void main(int i){
while(isShouldSub){//while is better than if,source code
// if(isShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=0;j<10;j++){
System.out.println("main thread number " + j + " of " + i);
}
isShouldSub = true;
this.notify();
}
}
}
一个经典的面试题,子线程运行10次,主线程运行10次,如此循环往复50次。请写出程序。
Note:
1. 需要加锁的方法一定写到一个类里面(同一个业务,好处就是为同一个对象加锁才会真正的互斥,实现方便,latch门闩)!
2. 在判断变量isShouldSub时,请用while,因为个别极端情况下会出现伪唤醒,伪唤醒时使用if就会出错!!假如出现伪唤醒,while判断一次还可以再次返回判断。这一点请参考Java doc中的wait文档,里面有详细说明。