We can use a semaphore for communication between threads to print alternative numbers using 3 threads-
Create 3 semaphores as follows-
Semaphore one = new Semaphore(1); Semaphore two = new Semaphore(0); Semaphore three = new Semaphore(0);
Pass this to threads as follows-
PrintOneNumber printOneNumber = new PrintOneNumber(one, two); PrintTwoNumber printTwoNumber = new PrintTwoNumber(two, three); PrintThreeNumber printThreeNumber = new PrintThreeNumber(three, one);
The first thread will have
@Override public void run() { for (int i = 1;; i = i + 3) { try { sempahoreOne.acquire(); System.out.println(i); sempahoreTwo.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }
The second topic will have
@Override public void run() { for (int i = 2;; i = i + 3) { try { sempahoreTwo.acquire(); Thread.sleep(1000); System.out.println(i); sempahoreThree.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }
The third thread will have
@Override public void run() { for (int i = 3;; i = i + 3) { try { sempahoreThree.acquire(); Thread.sleep(1000); System.out.println(i); sempahoreOne.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }
Detailed explanations with diagrams and source code -
Java semaphore - printing a sequence of alternative numbers using three streams
source share