案例:子线程循环10次后,主线程循环5次后再让子线程循环10次,如此重复10次,请编写代码实现。
实现代码如下:
public class ThreadBox{
private boolean flag = true;
public synchronized void main() {
while (!flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 1; i <= 5; i++) {
System.out.println("主线程,第"+i+"次循环");
}
flag = false;
this.notify();
}
public synchronized void sub() {
while (flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 1; i <=10; i++) {
System.out.println("子线程,第"+i+"次循环");
}
flag = true;
this.notify();
}
}
注意:①在这里需要注意的是,线程的同步监听器对象和调用wait方法的对象要是同一个,不然就报错。
②而且线程等待存在一个假唤醒状态,所以需要使用while来检测是否可执行状态flag,不然可能造成线程在没有唤醒是被唤醒,最终导致代码出错。
下列代码表示:调用wait方法的对象与线程同步监听对象不是同一个对象的代码,会报错
public class ThreadBox{
private boolean flag = true;
public void main() {
synchronized (Object.class) {
while (!flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 1; i <= 5; i++) {
System.out.println("主线程,第"+i+"次循环");
}
flag = false;
this.notify();
}
}
public void sub() {
synchronized (Object.class) {
while (flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 1; i <=10; i++) {
System.out.println("子线程,第"+i+"次循环");
}
flag = true;
this.notify();
}
}
}