[Problem] Printing Even and Odd using Two Threads with Coordination

Problem

Create two threads - one that prints odd numbers till 10 in the format "Odd 1", "Odd 3" etc. and one that prints even numbers till 10 in the format "Even 0", "Even 2" etc..

Need to implement coordination between them so that the output will be:

Even0

Odd1

Even2

Odd3

Even4

Odd5

Even6

Odd7

Even8

Odd9

Even10

Hint: The order should be same theoretically and practically. Putting a sleep while printing might work in some cases, but it cannot be guaranteed always.

 

Solution

package com.javajee.threads;

enum CurrentState {
  EVEN, ODD
};

public class EvenOddSynchronization {

  public static volatile CurrentState currentState = CurrentState.EVEN;
  public static volatile Object lockObject = new Object();

  public static void main(String[] args) throws InterruptedException {

    Thread t1 = new Thread(new MyRunnableEven());
    Thread t2 = new Thread(new MyRunnableOdd());
    t1.start();
    t2.start();
  }
}

class MyRunnableEven implements Runnable {

  CurrentState allowedState = CurrentState.EVEN;

  @Override
  public void run() {

    for (int i = 0; i <= 10; i = i + 2) {
      synchronized (EvenOddSynchronization.lockObject) {
        while (allowedState != EvenOddSynchronization.currentState) {

          try {
            EvenOddSynchronization.lockObject.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }

        System.out.println("Even: " + i);
        EvenOddSynchronization.currentState = CurrentState.ODD;
        EvenOddSynchronization.lockObject.notify();
      }
    }
  }
}

class MyRunnableOdd implements Runnable {

  CurrentState allowedState = CurrentState.ODD;

  @Override
  public void run() {

    for (int i = 1; i < 10; i = i + 2) {
      synchronized (EvenOddSynchronization.lockObject) {
        while (allowedState != EvenOddSynchronization.currentState) {

          try {
            EvenOddSynchronization.lockObject.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }

        System.out.println("Odd: " + i);
        EvenOddSynchronization.currentState = CurrentState.EVEN;
        EvenOddSynchronization.lockObject.notify();
      }
    }
  }
}

Important Note

  • The currentState enum variable determines which thread should be executed. 

    • Each thread is assigned an allowed state

    • If the allowed state is different from current state, it will wait.

    • If the allowed state is same as current state, it will print number, change the state and notify the other waiting thread.

  • You may also use notifyAll instead of notify when you are using wait-loop-idiom, as suggested by the book Effective Java.

 

Alternate thoughts

  1. You might think to use a Thread.sleep to try to simulate the situation, but the behaviour can never be guaranteed always in that way.

  2. You may be tempted to use notify and wait without the wait-loop check as in  javaquizzes/question-53. Check the question for issues with this approach.

  3. You may be tempted to use wait and notify in different orders to solve above issue as in javaquizzes/question-54. Check the question for issues with this approach.

Quick Notes Finder Tags

Activities (1) advanced java (1) agile (3) App Servers (6) archived notes (2) Arrays (1) Best Practices (12) Best Practices (Design) (3) Best Practices (Java) (7) Best Practices (Java EE) (1) BigData (3) Chars & Encodings (6) coding problems (2) Collections (15) contests (3) Core Java (All) (55) course plan (2) Database (12) Design patterns (8) dev tools (3) downloads (2) eclipse (9) Essentials (1) examples (14) Exception (1) Exceptions (4) Exercise (1) exercises (6) Getting Started (18) Groovy (2) hadoop (4) hibernate (77) hibernate interview questions (6) History (1) Hot book (5) http monitoring (2) Inheritance (4) intellij (1) java 8 notes (4) Java 9 (1) Java Concepts (7) Java Core (9) java ee exercises (1) java ee interview questions (2) Java Elements (16) Java Environment (1) Java Features (4) java interview points (4) java interview questions (4) javajee initiatives (1) javajee thoughts (3) Java Performance (6) Java Programmer 1 (11) Java Programmer 2 (7) Javascript Frameworks (1) Java SE Professional (1) JPA 1 - Module (6) JPA 1 - Modules (1) JSP (1) Legacy Java (1) linked list (3) maven (1) Multithreading (16) NFR (1) No SQL (1) Object Oriented (9) OCPJP (4) OCPWCD (1) OOAD (3) Operators (4) Overloading (2) Overriding (2) Overviews (1) policies (1) programming (1) Quartz Scheduler (1) Quizzes (17) RabbitMQ (1) references (2) restful web service (3) Searching (1) security (10) Servlets (8) Servlets and JSP (31) Site Usage Guidelines (1) Sorting (1) source code management (1) spring (4) spring boot (3) Spring Examples (1) Spring Features (1) spring jpa (1) Stack (1) Streams & IO (3) Strings (11) SW Developer Tools (2) testing (1) troubleshooting (1) user interface (1) vxml (8) web services (1) Web Technologies (1) Web Technology Books (1) youtube (1)