From b49dd4f1ac66b46697fcd367bd572d48eca51fe3 Mon Sep 17 00:00:00 2001 From: Vaibhav Sahay Date: Fri, 2 Nov 2018 09:37:00 +0530 Subject: [PATCH] print odd and even using Semaphore --- .../concurrent/evenandodd/SemaphoreDemo.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/SemaphoreDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/SemaphoreDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/SemaphoreDemo.java new file mode 100644 index 0000000000..c3afba1f68 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/SemaphoreDemo.java @@ -0,0 +1,83 @@ +package com.baeldung.concurrent.evenandodd; + +import java.util.concurrent.Semaphore; + +public class SemaphoreDemo { + + public static void main(String[] args) { + + SharedPrinter sp = new SharedPrinter(); + Thread odd = new Thread(new Odd(sp, 10)); + odd.setName("Odd"); + Thread even = new Thread(new Even(sp, 10)); + even.setName("Even"); + + odd.start(); + even.start(); + + } + +} + +class SharedPrinter { + + Semaphore semEven = new Semaphore(0); + Semaphore semOdd = new Semaphore(1); + + public void printEvenNum(int num) { + try { + semEven.acquire(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(Thread.currentThread() + .getName() + ":"+num); + semOdd.release(); + } + + public void printOddNum(int num) { + try { + semOdd.acquire(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(Thread.currentThread() + .getName() + ":"+ num); + semEven.release(); + + } +} + +class Even implements Runnable { + SharedPrinter sp; + int max; + + Even(SharedPrinter sp, int max) { + this.sp = sp; + this.max = max; + } + + @Override + public void run() { + for (int i = 2; i <= max; i = i + 2) { + sp.printEvenNum(i); + } + } +} + +class Odd implements Runnable { + SharedPrinter sp; + int max; + + Odd(SharedPrinter sp, int max) { + this.sp = sp; + this.max = max; + } + + @Override + public void run() { + for (int i = 1; i <= max; i = i + 2) { + sp.printOddNum(i); + } + } +}