Printing Even and Odd using two Threads in Java

java, multithreading, synchronization

Solution

Found the solution. Someone looking for solution to this problem can refer :-)

public class PrintEvenOddTester {

    public static void main(String... args) {
        Printer print = new Printer();
        Thread t1 = new Thread(new TaskEvenOdd(print, 10, false));
        Thread t2 = new Thread(new TaskEvenOdd(print, 10, true));
        t1.start();
        t2.start();
    }

}

class TaskEvenOdd implements Runnable {

    private int max;
    private Printer print;
    private boolean isEvenNumber;

    TaskEvenOdd(Printer print, int max, boolean isEvenNumber) {
        this.print = print;
        this.max = max;
        this.isEvenNumber = isEvenNumber;
    }

    @Override
    public void run() {

        //System.out.println("Run method");
        int number = isEvenNumber == true ? 2 : 1;
        while (number <= max) {

            if (isEvenNumber) {
                //System.out.println("Even :"+ Thread.currentThread().getName());
                print.printEven(number);
                //number+=2;
            } else {
                //System.out.println("Odd :"+ Thread.currentThread().getName());
                print.printOdd(number);
                // number+=2;
            }
            number += 2;
        }

    }

}

class Printer {

    boolean isOdd = false;

    synchronized void printEven(int number) {

        while (isOdd == false) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Even:" + number);
        isOdd = false;
        notifyAll();
    }

    synchronized void printOdd(int number) {
        while (isOdd == true) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Odd:" + number);
        isOdd = true;
        notifyAll();
    }

}

This gives output like:

Odd:1
Even:2
Odd:3
Even:4
Odd:5
Even:6
Odd:7
Even:8
Odd:9
Even:10

Problem

I tried the code below. I took this piece of code from some other post which is correct as per the author. But when I try running, it doesn't give me the exact result. This is mainly to print even and odd values in sequence. ``` public class PrintEvenOddTester { public static void main(String ... args){ Printer print = new Printer(false); Thread t1 = new Thread(new TaskEvenOdd(print)); Thread t2 = new Thread(new TaskEvenOdd(print)); t1.start(); t2.start(); } } class TaskEvenOdd implements Runnable { int number=1; Printer print; TaskEvenOdd(Printer print){ this.print = print; } @Override public void run() { System.out.println("Run method"); while(number<10){ if(number%2 == 0){ System.out.println("Number is :"+ number); print.printEven(number); number+=2; } else { System.out.println("Number is :"+ number); print.printOdd(number); number+=2; } } } } class Printer { boolean isOdd; Printer(boolean isOdd){ this.isOdd = isOdd; } synchronized void printEven(int number) { while(isOdd){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Even:"+number); isOdd = true; notifyAll(); } synchronized void printOdd(int number) { while(!isOdd){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Odd:"+number); isOdd = false; notifyAll(); } } ``` Can someone help me in fixing this? EDIT Expected result: Odd:1 Even:2 Odd:3 Even:4 Odd:5 Even:6 Odd:7 Even:8 Odd:9

Original source