Мне задали следующий вопрос в интервью, где мне нужно распечатать четные и нечетные числа, используя два потока, поэтому я пришел с кодом ниже, но в этом я использую два класса, один из которых реализует работающий интерфейс, а другой - для распечатки.число, которое использует wait
и notifyAll
.
public class PrintEvenOddTester {
public static void main(String[] args) {
Output print = new Output();
Thread t1 = new Thread(new EvenOddTask(print, 10, false));
Thread t2 = new Thread(new EvenOddTask(print, 10, true));
t1.start();
t2.start();
}
}
class EvenOddTask implements Runnable {
private int max;
private Output print;
private boolean isEvenNumber;
EvenOddTask(Output print, int max, boolean isEvenNumber) {
this.print = print;
this.max = max;
this.isEvenNumber = isEvenNumber;
}
@Override
public void run() {
int number = isEvenNumber == true ? 2 : 1;
while (number <= max) {
if (isEvenNumber) {
print.printEven(number);
} else {
print.printOdd(number);
}
number += 2;
}
}
}
class Output {
boolean isOdd = false;
public synchronized void printEven(int number) {
while (isOdd == false) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Even:" + number);
isOdd = false;
notifyAll();
}
public synchronized void printOdd(int number) {
while (isOdd == true) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Odd:" + number);
isOdd = true;
notifyAll();
}
}
Я хотел проверить, существует ли какой-либо лучший или простой способ выполнения подобных задач в Java 7. В общем случае вместо использования другого Output
класс, я не могу распечатать непосредственно в EvenOddTask
классе?