问题
子线程循环10次,主线程循环100次,又子线程循环10次,主线程循环100次,如此循环50次,写出代码实现。
代码实现
/**
* 将线程需要同步的资源包装在一个类里面,
* 不要由外层代码去控制资源同步,这样做的好处是易维护和高内聚。
* @author liujun
*/
public class Busnice {
/**是否是到子线程执行了*/
private boolean isSubTime = true;
public synchronized void sub(int i) {
while(!isSubTime){
try {
//线程等待
this.wait();//调用的对象一定是锁对象否则出错,此时让出cpu,其他线程可以进入sync方法
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j = 1; j <=10; j++){
System.out.println("sub thread of"+j+"---loop:"+i);
}
isSubTime = false;
//唤醒等待线程
this.notify();
}
public synchronized void mian(int i) {
while(isSubTime){
try {
//线程等待
this.wait();//调用的对象一定是锁对象否则出错
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j = 1; j <=100; j++){
System.out.println("mian thread of "+j+"---loop:"+i);
}
isSubTime = true;
//唤醒等待线程
this.notify();
}
}
public class Main {
public static void main(String[] args) {
final Busnice busnice = new Busnice();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i <= 50; i++) {
busnice.sub(i);
}
}
});
thread.start();
for(int i = 1; i <= 50; i++) {
busnice.mian(i);
}
}
}
wait方法除了阻塞当前线程外,会让出CPU资源,此时其他线程可以进入sync方法,而notify是唤醒其中一个处于wait阻塞的线程,让它继续执行。
wait:释放执行权和释放锁
sleep:释放执行权,不释放锁