У меня есть этот код, где я хочу, чтобы оба напечатали foo и bar альтернативно n количество раз. Для этого случая я взял n как 1.
Этот код печатает foo дополнительно, еще раз.
Видно, что foo thread находится в режиме ожидания, и когда bar уведомляет, он запускается, но в идеале я хочу, чтобы foo и bar печатались только один раз.
Ниже код
Основной класс
public class TestClass {
public static void main(String[] args) throws InterruptedException {
FooBar foobar = new FooBar(1);
new Thread(() -> {
try {
foobar.foo(new Runnable() {
@Override
public void run() {
System.out.println("foo");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
foobar.bar(new Runnable() {
@Override
public void run() {
System.out.println("bar");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
Общий объект
class FooBar {
private int n;
private boolean flag = true;
private int i = 0;
public FooBar(int n) {
this.n = 2 * n;
}
public void foo(Runnable printFoo) throws InterruptedException {
synchronized (this) {
while (i < n) {
System.out.println("Checking loop in foo " + i);
while (!flag) {
System.out.println("foo waiting " + i);
this.wait();
System.out.println("foo notified " + i);
}
System.out.println("foo " + i);
++i;
flag = !flag;
notify();
}
}
}
public void bar(Runnable printBar) throws InterruptedException {
synchronized (this) {
while (i < n) {
System.out.println("checking loop in bar" + i);
while (flag) {
System.out.println("bar waiting" + i);
this.wait();
System.out.println("bar notified" + i);
}
System.out.println("bar " + i);
++i;
flag = !flag;
notify();
}
}
}
}
Как сделать нить foo , чтобы не печатать foo дважды ??