Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package petikolokvijum;
- import java.awt.Color;
- import java.util.concurrent.Semaphore;
- import java.util.concurrent.atomic.AtomicBoolean;
- import java.util.concurrent.atomic.AtomicInteger;
- import java.util.concurrent.locks.Condition;
- import java.util.concurrent.locks.ReentrantLock;
- import os.simulation.SimulationContainer;
- import os.simulation.SimulationContainerLayout;
- import os.simulation.SimulationThread;
- import os.simulation.gui.SimulationFrame;
- import os.simulation.gui.SimulationPanel;
- import os.simulation.gui.swing.SwingSimulationPanel;
- public class Luvr {
- private class Ekskurzija{
- private Semaphore brItalijana = new Semaphore(5);
- private Semaphore brEngleza = new Semaphore(5);
- private Semaphore brFrancuza = new Semaphore(5);
- int brEng = 0;
- int brIta = 0;
- int brFran = 0;
- private Semaphore mutex = new Semaphore(1);
- private Semaphore mutex2 = new Semaphore(1);
- private Semaphore mutex3 = new Semaphore(1);
- private Semaphore muzej = new Semaphore(1);
- public void udjiEnglez() throws InterruptedException{
- brEngleza.acquire();
- mutex.acquire();
- brEng ++;
- if (brEng == 1){
- muzej.acquire();
- }
- mutex.release();
- }
- public void izadjiEnglez() throws InterruptedException{
- mutex.acquire();
- brEng --;
- if(brEng == 0){
- muzej.release();
- brEngleza.release(5);
- }
- mutex.release();
- }
- public void udjiItalijan() throws InterruptedException{
- brItalijana.acquire();
- mutex2.acquire();
- brIta ++;
- if(brIta == 1){
- muzej.acquire();
- }
- mutex2.release();
- }
- public void izadjiItalijan() throws InterruptedException{
- mutex2.acquire();
- brIta --;
- if(brIta == 0){
- muzej.release();
- brItalijana.release(5);
- }
- mutex2.release();
- }
- public void udjiFrancuz() throws InterruptedException{
- brFrancuza.acquire();
- mutex3.acquire();
- brFran ++;
- if(brFran == 1){
- muzej.acquire();
- }
- mutex3.release();
- }
- public void izadjiFrancuz() throws InterruptedException{
- mutex3.acquire();
- brFran --;
- if(brFran == 0){
- muzej.release();
- brFrancuza.release(5);
- }
- mutex3.release();
- }
- }
- private class Englez extends SimulationThread {
- private Ekskurzija e;
- public Englez(int id, Ekskurzija e) {
- super(TEXT_ENGLEZ + " " + id, BOJA_ENGLEZ);
- this.e = e;
- setContainer(obradjujeEnglez);
- }
- @Override
- protected void run() {
- while (!isStopRequested()) {
- step();
- waitWhileSuspended();
- }
- }
- @Override
- protected void step() {
- try{
- ceka();
- if(isInterrupted()){
- Thread.interrupted();
- }
- e.udjiEnglez();
- obilazi();
- if(isInterrupted()){
- Thread.interrupted();
- }
- e.izadjiEnglez();
- }catch(InterruptedException e) {
- }
- if(Thread.interrupted()){
- stopGracefully();
- }
- }
- private void obilazi() {
- setContainer(pristupMuzej);
- setText(TEXT_OBILAZI);
- work(DUZINA_OBRADE, 2 * DUZINA_OBILASKA);
- setText(TEXT_OBISAO);
- setContainer(obradjujeEnglez);
- }
- private void ceka() {
- setContainer(obradjujeEnglez);
- setText(TEXT_OBRADJUJE);
- work(DUZINA_OBRADE, 2 * DUZINA_CEKANJA);
- setText(TEXT_OBRADIO);
- }
- }
- private class Francuz extends SimulationThread {
- private Ekskurzija e;
- public Francuz(int id, Ekskurzija e) {
- super(TEXT_FRANCUZ + " " + id, BOJA_FRANCUZ);
- this.e = e;
- setContainer(obradjujeFrancuz);
- }
- @Override
- protected void run() {
- while (!isStopRequested()) {
- step();
- waitWhileSuspended();
- }
- }
- @Override
- protected void step() {
- try{
- ceka();
- if(isInterrupted()){
- Thread.interrupted();
- }
- e.udjiFrancuz();
- obilazi();
- if(isInterrupted()){
- Thread.interrupted();
- }
- e.izadjiFrancuz();
- }catch(InterruptedException e) {
- }
- }
- private void obilazi() {
- setContainer(pristupMuzej);
- setText(TEXT_OBILAZI);
- work(DUZINA_OBRADE, 2 * DUZINA_OBILASKA);
- setText(TEXT_OBISAO);
- setContainer(obradjujeFrancuz);
- }
- private void ceka() {
- setContainer(obradjujeFrancuz);
- setText(TEXT_OBRADJUJE);
- work(DUZINA_OBRADE, 2 * DUZINA_CEKANJA);
- setText(TEXT_OBRADIO);
- }
- }
- private class Italijan extends SimulationThread {
- private Ekskurzija e;
- public Italijan(int id, Ekskurzija e) {
- super(TEXT_ITALIJAN + " " + id, BOJA_ITALIJAN);
- this.e = e;
- setContainer(obradjujeItalijan);
- }
- @Override
- protected void run() {
- while (!isStopRequested()) {
- step();
- waitWhileSuspended();
- }
- }
- @Override
- protected void step() {
- try{
- ceka();
- if(isInterrupted()){
- Thread.interrupted();
- }
- e.udjiItalijan();
- obilazi();
- if(isInterrupted()){
- Thread.interrupted();
- }
- e.izadjiItalijan();
- }catch(InterruptedException e) {
- }
- }
- private void obilazi() {
- setContainer(pristupMuzej);
- setText(TEXT_OBILAZI);
- work(DUZINA_OBRADE, 2 * DUZINA_OBILASKA);
- setText(TEXT_OBISAO);
- setContainer(obradjujeItalijan);
- }
- private void ceka() {
- setContainer(obradjujeItalijan);
- setText(TEXT_OBRADJUJE);
- work(DUZINA_OBRADE, 2 * DUZINA_CEKANJA);
- setText(TEXT_OBRADIO);
- }
- }
- // Parametri simulacije
- public static final int DUZINA_OBILASKA = 100;
- public static final int DUZINA_CEKANJA = 1500;
- public static final int DUZINA_OBRADE = 7500;
- public static final int BROJ_ENGLEZA = 10;
- public static final int BROJ_FRANCUZA = 10;
- public static final int BROJ_ITALIJANA = 10;
- // Boje
- public static final Color BOJA_ENGLEZ = new Color(148, 45, 17);
- public static final Color BOJA_FRANCUZ = new Color(18, 143, 229);
- public static final Color BOJA_ITALIJAN = new Color(243, 45, 56);
- public static final Color BOJA_ITALIJANI = null;
- public static final Color BOJA_FRANCUZI = null;
- public static final Color BOJA_ENGLEZI = null;
- public static final Color BOJA_MUZEJA = new Color(128, 255, 128);
- // Stringovi
- public static final String TEXT_ENGLEZ ="\u0415\u043D\u0433\u043B\u0435\u0437";
- public static final String TEXT_FRANCUZ ="\u0424\u0440\u0430\u043D\u0446\u0443\u0437";
- public static final String TEXT_ITALIJAN = "\u0418\u0442\u0430\u043B\u0438\u0458\u0430\u043D";
- public static final String TEXT_CEKA = "\u0447\u0435\u043A\u0430";
- public static final String TEXT_OBILAZI = "\u043E\u0431\u0438\u043B\u0430\u0437\u0438";
- public static final String TEXT_OBISAO = "\u043E\u0431\u0438\u0430\u043E";
- public static final String TEXT_OBRADJUJE = "\u0420\u0430\u0434\u0438";
- public static final String TEXT_OBRADIO = "\u0427\u0435\u043A\u0430";
- public static final String TEXT_MUZEJ = "\u041C\u0443\u0437\u0435\u0458";
- // Glavni program
- public static void main(String[] a) {
- new Luvr();
- }
- // Stanja
- private SimulationContainer pristupMuzej = new SimulationContainer(TEXT_MUZEJ, BOJA_MUZEJA, SimulationContainerLayout.BOX);
- private SimulationContainer obradjujeEnglez = new SimulationContainer(TEXT_ENGLEZ, BOJA_ENGLEZI, SimulationContainerLayout.BOX);
- private SimulationContainer obradjujeFrancuz = new SimulationContainer(TEXT_FRANCUZ, BOJA_FRANCUZI, SimulationContainerLayout.BOX);
- private SimulationContainer obradjujeItalijan = new SimulationContainer(TEXT_ITALIJAN, BOJA_ITALIJANI, SimulationContainerLayout.BOX);
- private SimulationContainer van = new SimulationContainer(SimulationContainerLayout.ROW, obradjujeEnglez, obradjujeItalijan,obradjujeFrancuz);
- private SimulationContainer sve = new SimulationContainer(SimulationContainerLayout.COLUMN, van, pristupMuzej);
- public Luvr() {
- Ekskurzija e = new Ekskurzija();
- // Create frame
- SimulationPanel panel = new SwingSimulationPanel(sve);
- SimulationFrame frame = SimulationFrame.create("Ekskurzija", panel);
- // Create threads
- for (int i = 1; i <= BROJ_ITALIJANA; i++) {
- new Italijan(i,e).start();
- }
- for (int i = 1; i <= BROJ_ENGLEZA; i++) {
- new Englez(i,e).start();
- }
- for (int i = 1; i <= BROJ_FRANCUZA; i++) {
- new Francuz(i,e).start();
- }
- // Show the frame
- frame.display();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement