子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
代码如下:
/*
*子线程循环5次,接着主线程循环10次,接着又回到子线程循环5次,然后再到主线程循环10次,如此反复执行5次;
*synchronized解决线程互斥
*/
public class ThreadSyn {
public static void main(String[] args) {
final Loop loop = new Loop();
// 子线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
loop.sun(i);
}
}
}).start();
// 主线程,mian方法本身就是一个主线程
for (int i = 1; i <= 5; i++) {
loop.mian(i);
}
}
}
class Loop {
private boolean iswait = true;
/*
* 这里要注意wait和notify的用法,对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
* 任何一个时刻,对象的控制权(monitor)只能被一个线程拥有
*/
public synchronized void sun(int i) {
while (!iswait) {
try {
System.out.println("子线程等待。。。。。");
this.wait();// 等待主线程执行结束
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 5; j++) {
System.out.println("子线程:" + j + "循环次数" + i);
}
System.out.println("*******");
iswait = false;
this.notify();// 唤醒主线程
System.out.println(" 唤醒主线程");
}
public synchronized void mian(int i) {
while (iswait) {
try {
System.out.println("主线程等待。。。。。");
this.wait();// 等待子线程结束
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int j = 1; j <= 10; j++) {
System.out.println("主线程:" + j + "循环次数" + i);
}
System.out.println("^^^^^^^^^^");
iswait = true;
this.notify();// 唤醒子线程
System.out.println(" 唤醒子线程");
}
}
这里有2个注释不是很准,就是this.notify();这个方法我有点模糊,第一个notify按理来说应该是唤醒子线程,因为this在sun()方法里面,所以我这样认为的,不过this是代表当前对象,也就是Loop这个类,这里我就更晕了,Loop又不是一个线程,this.notify是咋回事呢,反正我这样写出来了,notify不清楚也没办法了,只能以后再慢慢弄懂了