Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package mk.ukim.finki.os.synchronization.exam14.june;
- import mk.ukim.finki.os.synchronization.ProblemExecution;
- import mk.ukim.finki.os.synchronization.TemplateThread;
- import java.util.Date;
- import java.util.HashSet;
- import java.util.concurrent.Semaphore;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- public class OxalicAcid {
- static Semaphore semC, semH, semO;
- static Semaphore semHereC, semHereH, semHereO;
- static Semaphore semReady, semDone;
- static Semaphore semNext;
- static int c,h,o;
- static Lock lock;
- public static void init() {
- semC = new Semaphore(2);
- semH = new Semaphore(2);
- semO = new Semaphore(4);
- semHereO = new Semaphore(0);
- semHereH = new Semaphore(0);
- semHereC = new Semaphore(0);
- semReady = new Semaphore(7);
- semDone = new Semaphore(0);
- semNext = new Semaphore(0);
- c = h = o = 0;
- lock = new ReentrantLock();
- }
- public static class Carbon extends TemplateThread {
- public Carbon(int numRuns) {
- super(numRuns);
- }
- @Override
- public void execute() throws InterruptedException {
- semC.acquire();
- lock.lock();
- c++;
- if(c==2)
- {
- c=0;
- lock.unlock();
- semHereC.acquire();
- semHereH.acquire(2);
- semHereO.acquire(4);
- semReady.release(7);
- state.bond();
- semDone.acquire(7);
- semNext.release(7);
- state.validate();
- }
- else
- {
- lock.unlock();
- semHereC.release();
- semReady.acquire();
- state.bond();
- semDone.release();
- semNext.acquire();
- }
- semC.release();
- }
- }
- public static class Hydrogen extends TemplateThread {
- public Hydrogen(int numRuns) {
- super(numRuns);
- }
- @Override
- public void execute() throws InterruptedException {
- semH.acquire();
- semHereH.release();
- semReady.acquire();
- state.bond();
- semDone.release();
- semNext.acquire();
- semH.release();
- }
- }
- public static class Oxygen extends TemplateThread {
- public Oxygen(int numRuns) {
- super(numRuns);
- }
- @Override
- public void execute() throws InterruptedException {
- semO.acquire();
- semHereO.release();
- semReady.acquire();
- state.bond();
- semDone.release();
- semNext.acquire();
- semO.release();
- }
- }
- static OxalicAcidState state = new OxalicAcidState();
- public static void main(String[] args) {
- for (int i = 0; i < 10; i++) {
- run();
- }
- }
- public static void run() {
- try {
- int numRuns = 1;
- int numScenarios = 300;
- HashSet<Thread> threads = new HashSet<Thread>();
- for (int i = 0; i < numScenarios; i++) {
- Oxygen o = new Oxygen(numRuns);
- threads.add(o);
- if (i % 2 == 0) {
- Hydrogen h = new Hydrogen(numRuns);
- Carbon c = new Carbon(numRuns);
- threads.add(c);
- threads.add(h);
- }
- }
- 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