diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eaf1da5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +os/code/target/* diff --git a/os/code/os/pom.xml b/os/code/os/pom.xml new file mode 100644 index 0000000..6425d7c --- /dev/null +++ b/os/code/os/pom.xml @@ -0,0 +1,81 @@ + + + + 4.0.0 + + com.scaler + os + pyenv shell 3.9.7 + + os + + http://www.example.com + + + UTF-8 + 1.9 + 1.9 + + + + + junit + junit + 4.11 + test + + + org.projectlombok + lombok + 1.18.24 + provided + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + diff --git a/os/code/os/src/main/java/com/scaler/App.java b/os/code/os/src/main/java/com/scaler/App.java new file mode 100644 index 0000000..6a73e3c --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/App.java @@ -0,0 +1,13 @@ +package com.scaler; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/os/code/os/src/main/java/com/scaler/addersubtractor/Adder.java b/os/code/os/src/main/java/com/scaler/addersubtractor/Adder.java new file mode 100644 index 0000000..d42c8f2 --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/addersubtractor/Adder.java @@ -0,0 +1,22 @@ +package com.scaler.addersubtractor; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class Adder implements Runnable { + private Count count; + + @Override + public void run() { + + for (int i = 1; i <= 100; ++i) { + count.getValue().getAndAdd(i); + try { + Thread.sleep(10); + } catch (Exception e) { + System.out.println("Something wrong happened"); + } + } + + } +} diff --git a/os/code/os/src/main/java/com/scaler/addersubtractor/Count.java b/os/code/os/src/main/java/com/scaler/addersubtractor/Count.java new file mode 100644 index 0000000..348de30 --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/addersubtractor/Count.java @@ -0,0 +1,15 @@ +package com.scaler.addersubtractor; + +import java.util.concurrent.atomic.AtomicInteger; + +public class Count { + private AtomicInteger value = new AtomicInteger(0); + + public AtomicInteger getValue() { + return value; + } + + public void setValue(AtomicInteger value) { + this.value = value; + } +} diff --git a/os/code/os/src/main/java/com/scaler/addersubtractor/Runner.java b/os/code/os/src/main/java/com/scaler/addersubtractor/Runner.java new file mode 100644 index 0000000..795718c --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/addersubtractor/Runner.java @@ -0,0 +1,27 @@ +package com.scaler.addersubtractor; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class Runner { + public static void main(String[] args) { + Count count = new Count(); + + Adder adder = new Adder(count); + Subtractor subtractor = new Subtractor(count); + + ExecutorService executor = Executors.newCachedThreadPool(); + executor.execute(adder); + executor.execute(subtractor); + + executor.shutdown(); + try { + executor.awaitTermination(100, TimeUnit.SECONDS); + } catch (Exception e) { + System.out.println("Something wrong happened"); + } + + System.out.println(count.getValue()); + } +} diff --git a/os/code/os/src/main/java/com/scaler/addersubtractor/Subtractor.java b/os/code/os/src/main/java/com/scaler/addersubtractor/Subtractor.java new file mode 100644 index 0000000..ae80473 --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/addersubtractor/Subtractor.java @@ -0,0 +1,28 @@ +package com.scaler.addersubtractor; + +import java.util.concurrent.locks.Lock; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class Subtractor implements Runnable { + private Count count; + + @Override + public void run() { + + for (int i = 1; i <= 100; ++i) { + count.getValue().getAndAdd(-i); + try { + Thread.sleep(10); + } catch (Exception e) { + System.out.println("Something wrong happened"); + } + + for (int j = 0; j < 10000; ++j) { + // do something + } + } + + } +} \ No newline at end of file diff --git a/os/code/os/src/main/java/com/scaler/producerconsumer/Consumer.java b/os/code/os/src/main/java/com/scaler/producerconsumer/Consumer.java new file mode 100644 index 0000000..8fc0f05 --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/producerconsumer/Consumer.java @@ -0,0 +1,36 @@ +package com.scaler.producerconsumer; + +import java.util.Queue; +import java.util.concurrent.Semaphore; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class Consumer implements Runnable { + + private Queue store; + private String name; + private Semaphore forProducer; + private Semaphore forConsumer; + + @Override + public void run() { + while (true) { + try { + forConsumer.acquire(); + } catch (InterruptedException e) { + throw new RuntimeException("Error acquiring semaphore " + e); + } + + store.remove(); + System.out.println("Consumed: " + name + " Left units :" + store.size()); + + forProducer.release(); + + } + + } + +} diff --git a/os/code/os/src/main/java/com/scaler/producerconsumer/Producer.java b/os/code/os/src/main/java/com/scaler/producerconsumer/Producer.java new file mode 100644 index 0000000..d2650ec --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/producerconsumer/Producer.java @@ -0,0 +1,36 @@ +package com.scaler.producerconsumer; + +import java.util.Queue; +import java.util.concurrent.Semaphore; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class Producer implements Runnable { + + private Queue store; + private int maxSize; + private String name; + private Semaphore forProducer; + private Semaphore forConsumer; + + @Override + public void run() { + while (true) { + try { + forProducer.acquire(); + } catch (InterruptedException e) { + throw new RuntimeException("Error acquiring semaphore " + e); + } + + store.add(new UnitOfWork()); + System.out.println("Produced: " + name + " Left units :" + store.size()); + + forConsumer.release(); + } + + } + +} diff --git a/os/code/os/src/main/java/com/scaler/producerconsumer/Runner.java b/os/code/os/src/main/java/com/scaler/producerconsumer/Runner.java new file mode 100644 index 0000000..a9e5a81 --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/producerconsumer/Runner.java @@ -0,0 +1,35 @@ +package com.scaler.producerconsumer; + +import java.util.Queue; +import java.util.Set; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.Semaphore; +import java.util.stream.Collectors; + +public class Runner { + + private static final Set producerNames = Set.of("p1", "p2", "p3"); + private static final Set consumerNames = Set.of("c1", "c2", "c3", "c4"); + + public static void main(String[] args) { + Queue store = new ConcurrentLinkedDeque<>(); + int maxSize = 20; + + Semaphore forProducer = new Semaphore(maxSize); + Semaphore forConsumer = new Semaphore(0); + + Set producers = producerNames + .stream() + .map(name -> new Producer(store, maxSize, name, forProducer, forConsumer)) + .collect(Collectors.toSet()); + + Set consumers = consumerNames + .stream() + .map(name -> new Consumer(store, name, forProducer, forConsumer)) + .collect(Collectors.toSet()); + + producers.forEach(producer -> new Thread(producer).start()); + consumers.forEach(consumer -> new Thread(consumer).start()); + + } +} diff --git a/os/code/os/src/main/java/com/scaler/producerconsumer/UnitOfWork.java b/os/code/os/src/main/java/com/scaler/producerconsumer/UnitOfWork.java new file mode 100644 index 0000000..484e681 --- /dev/null +++ b/os/code/os/src/main/java/com/scaler/producerconsumer/UnitOfWork.java @@ -0,0 +1,5 @@ +package com.scaler.producerconsumer; + +public class UnitOfWork { + +} diff --git a/os/code/os/src/test/java/com/scaler/AppTest.java b/os/code/os/src/test/java/com/scaler/AppTest.java new file mode 100644 index 0000000..7ec3246 --- /dev/null +++ b/os/code/os/src/test/java/com/scaler/AppTest.java @@ -0,0 +1,20 @@ +package com.scaler; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/os/code/os/target/classes/com/scaler/App.class b/os/code/os/target/classes/com/scaler/App.class new file mode 100644 index 0000000..6737821 Binary files /dev/null and b/os/code/os/target/classes/com/scaler/App.class differ diff --git a/os/code/os/target/classes/com/scaler/producerconsumer/Consumer.class b/os/code/os/target/classes/com/scaler/producerconsumer/Consumer.class new file mode 100644 index 0000000..e35dd5b Binary files /dev/null and b/os/code/os/target/classes/com/scaler/producerconsumer/Consumer.class differ diff --git a/os/code/os/target/classes/com/scaler/producerconsumer/Producer.class b/os/code/os/target/classes/com/scaler/producerconsumer/Producer.class new file mode 100644 index 0000000..c554525 Binary files /dev/null and b/os/code/os/target/classes/com/scaler/producerconsumer/Producer.class differ diff --git a/os/code/os/target/classes/com/scaler/producerconsumer/Runner.class b/os/code/os/target/classes/com/scaler/producerconsumer/Runner.class new file mode 100644 index 0000000..7df08f9 Binary files /dev/null and b/os/code/os/target/classes/com/scaler/producerconsumer/Runner.class differ diff --git a/os/code/os/target/classes/com/scaler/producerconsumer/UnitOfWork.class b/os/code/os/target/classes/com/scaler/producerconsumer/UnitOfWork.class new file mode 100644 index 0000000..7ef319d Binary files /dev/null and b/os/code/os/target/classes/com/scaler/producerconsumer/UnitOfWork.class differ diff --git a/os/code/os/target/test-classes/com/scaler/AppTest.class b/os/code/os/target/test-classes/com/scaler/AppTest.class new file mode 100644 index 0000000..20815e5 Binary files /dev/null and b/os/code/os/target/test-classes/com/scaler/AppTest.class differ