Я пытался печатать нечетные, четные числа двумя потоками, повторяя, используя wait и notify.
Я могу добиться этого путем реализации интерфейса Runnable
public class OddEven implements Runnable {
public void run() {
for (int i = 1; i <= 100; i++) {
if (i % 2 == Integer.parseInt(Thread.currentThread().getName())) {
synchronized (this) {
notifyAll();
System.out.println((Thread.currentThread().getName().equals("1") ? "odd : " : "even: ") + i);
try {
if (i != 100)
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
OddEven obj = new OddEven();
Thread t1 = new Thread(obj, "1");
Thread t2 = new Thread(obj, "0");
t1.start();
t2.start();
}
}
O/P is:
Odd : 1
Even: 2
Odd : 3
Even: 4
Odd : 5
.
.
.
.
Odd : 97
Even: 98
Odd : 99
Even: 100
Затем я попробовал то же самое путем расширения класса Thread
public class Test {
public static void main(String[] args) {
Test t = new Test();
new OddThraed(t).start();
new EvenThraed(t).start();
}
}
class OddThraed extends Thread {
Test t;
public OddThraed(Test t) {
this.t = t;
}
public void run() {
for (int i = 1; i <= 100; i++) {
if (i % 2 == 1) {
synchronized (t) {
t.notifyAll();
System.out.println("Odd : " + i);
try {
if (i != 100)
t.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
class EvenThraed extends Thread {
Test t;
public EvenThraed(Test t) {
this.t = t;
}
public void run() {
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
synchronized (t) {
t.notifyAll();
System.out.println("Even: " + i);
try {
if (i != 100)
t.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
O / P было ожидаемым
Тогда я думаю, что существует слишком много классов и пытался достичь этого с помощью анонимного потока
public class TestOddEvenAnonymousThread {
public static void main(String[] args) {
(new Thread("Odd") {
public void run() {
for (int i = 1; i <= 100; i++) {
if (i % 2 == 1) {
synchronized (this) {
notifyAll();
System.out.println("Odd : " + i);
try {
if (i != 100)
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}).start();
(new Thread("Even") {
public void run() {
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
synchronized (this) {
notifyAll();
System.out.println("Even: " + i);
try {
if (i != 100)
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}).start();
}
}
But this time O/P is
Odd : 1
Even: 2
и есть тупик, может кто-нибудь объяснить, почему последний не показывает соответствующий o / p, где я просто пытаюсь достичь этого с помощью анонимного потока, а не путем расширения отдельного класса потока (что я сделал во втором подходе выше)