Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package mk.ukim.finki.os.synchronization.exam14.march;
- import java.util.Date;
- import java.util.HashSet;
- import java.util.Scanner;
- import java.util.concurrent.Semaphore;
- import mk.ukim.finki.os.synchronization.ProblemExecution;
- import mk.ukim.finki.os.synchronization.TemplateThread;
- public class CalciumNitride {
- static int numCal;
- static Semaphore numIncCal;
- static Semaphore Calcium;
- static Semaphore Nitrogen;
- static Semaphore calHere;
- static Semaphore nitHere;
- static Semaphore bond;
- static Semaphore validate;
- static Semaphore done;
- public static void init() {
- numCal = 0;
- numIncCal = new Semaphore(1);
- Calcium = new Semaphore(3);
- Nitrogen = new Semaphore(2);
- calHere = new Semaphore(0);
- nitHere = new Semaphore(0);
- bond = new Semaphore(0);
- validate = new Semaphore(0);
- done = new Semaphore(0);
- }
- public static class Calcium extends TemplateThread {
- public Calcium(int numRuns) {
- super(numRuns);
- }
- @Override
- public void execute() throws InterruptedException {
- Calcium.acquire();
- numIncCal.acquire();
- if(numCal == 0){
- numCal++;
- numIncCal.release();
- calHere.acquire(2);
- nitHere.acquire(2);
- bond.release(4);
- state.bond();
- validate.acquire(4);
- state.validate();
- numCal = 0;
- done.release(4);
- }else{
- numCal++;
- numIncCal.release();
- calHere.release();
- bond.acquire();
- state.bond();
- validate.release();
- done.acquire();
- }
- Calcium.release();
- }
- }
- public static class Nitrogen extends TemplateThread {
- public Nitrogen(int numRuns) {
- super(numRuns);
- }
- @Override
- public void execute() throws InterruptedException {
- Nitrogen.acquire();
- nitHere.release();
- bond.acquire();
- state.bond();
- validate.release();
- done.acquire();
- Nitrogen.release();
- }
- }
- static CalciumNitrideState state = new CalciumNitrideState();
- public static void main(String[] args) {
- for (int i = 0; i < 10; i++) {
- run();
- }
- }
- public static void run() {
- try {
- Scanner s = new Scanner(System.in);
- int numRuns = 1;
- int numIterations = 100;
- s.close();
- HashSet<Thread> threads = new HashSet<Thread>();
- for (int i = 0; i < numIterations; i++) {
- Nitrogen n = new Nitrogen(numRuns);
- threads.add(n);
- Calcium ca = new Calcium(numRuns);
- threads.add(ca);
- ca = new Calcium(numRuns);
- threads.add(ca);
- n = new Nitrogen(numRuns);
- threads.add(n);
- ca = new Calcium(numRuns);
- threads.add(ca);
- }
- init();
- ProblemExecution.start(threads, state);
- System.out.println(new Date().getTime());
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement