Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Се прави киселина C2H4O2 од два атоми на C, четири атоми на H и два атоми на O.
- * Да се синхронизира процесот на правење на киселина каде што треба да се ограничи влезот на атомите од секој елемент.
- * При влез, атомите печатат C/H/O here. Атомите треба да чекаат додека влезат потребниот број на атоми од секој елемент.
- * Откако ќе влезат потребните атоми спојувањето може да започне истовремено кај сите елементи со печатење на Module Bonding и се повикува Thread.sleep(100).
- * Откако атомотите ќе завршат со спојување, секој од нив треба да испечати C/H/O done, а само еден од нив Module Created.
- * После успешното спојување процесот може да започне од почеток.
- *
- */
- import java.util.HashSet;
- import java.util.concurrent.Semaphore;
- public class Vinegar {
- static Semaphore cEnter = new Semaphore(2);
- static Semaphore hEnter = new Semaphore(4);
- static Semaphore oEnter = new Semaphore(2);
- static int count = 0;
- static Semaphore lock = new Semaphore(1);
- static Semaphore canBond = new Semaphore(0);
- static class C extends Thread{
- public void execute() throws InterruptedException {
- cEnter.acquire();
- lock.acquire();
- count++;
- System.out.println("C here.");
- if(count==8) {
- canBond.release(8);
- }
- lock.release();
- canBond.acquire();
- System.out.println("Module Bonding.");
- Thread.sleep(100);
- lock.acquire();
- System.out.println("C done.");
- --count;
- if(count==0) {
- System.out.println("Module Created.");
- //glupava proverka
- if(cEnter.availablePermits() == 0 && hEnter.availablePermits() == 0 && oEnter.availablePermits() == 0) {
- cEnter.release(2);
- hEnter.release(4);
- oEnter.release(2);
- }
- }
- lock.release();
- }
- public void run() {
- try {
- execute();
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
- static class H extends Thread{
- public void execute() throws InterruptedException {
- hEnter.acquire();
- lock.acquire();
- count++;
- System.out.println("H here.");
- if(count==8) {
- canBond.release(8);
- }
- lock.release();
- canBond.acquire();
- System.out.println("Module Bonding.");
- Thread.sleep(100);
- lock.acquire();
- System.out.println("H done.");
- --count;
- if(count==0) {
- System.out.println("Module Created.");
- //glupava proverka
- if(cEnter.availablePermits() == 0 && hEnter.availablePermits() == 0 && oEnter.availablePermits() == 0) {
- cEnter.release(2);
- hEnter.release(4);
- oEnter.release(2);
- }
- }
- lock.release();
- }
- public void run() {
- try {
- execute();
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
- static class O extends Thread{
- public void execute() throws InterruptedException {
- oEnter.acquire();
- lock.acquire();
- count++;
- System.out.println("O here.");
- if(count==8) {
- canBond.release(8);
- }
- lock.release();
- canBond.acquire();
- System.out.println("Module Bonding.");
- Thread.sleep(100);
- lock.acquire();
- System.out.println("O done.");
- --count;
- if(count==0) {
- System.out.println("Module Created.");
- //glupava proverka
- if(cEnter.availablePermits() == 0 && hEnter.availablePermits() == 0 && oEnter.availablePermits() == 0) {
- cEnter.release(2);
- hEnter.release(4);
- oEnter.release(2);
- }
- }
- lock.release();
- }
- public void run() {
- try {
- execute();
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
- public static void main(String[] args) throws InterruptedException {
- // TODO Auto-generated method stub
- HashSet <Thread> threads = new HashSet<>();
- for(int i=0;i<30;i++) {
- C c = new C();
- O o = new O();
- threads.add(c);
- threads.add(o);
- }
- for(int i=0;i<60;i++) {
- H h = new H();
- threads.add(h);
- }
- for(Thread t : threads) {
- t.start();
- }
- for(Thread t : threads) {
- t.join(2000);
- }
- for(Thread t : threads) {
- if(t.isAlive()) {
- t.interrupt();
- System.out.println("Possible Deadlock!");
- }
- }
- System.out.println("Process Finished.");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement