package concorrencia; import java.awt.*; import javax.swing.*; public class WritersHP { boolean packFrame = true; static int readCount, writeCount, TAcount; static Semaforo MutexR, MutexW; static Semaforo WSema, RSema, QueueR; static Semaforo TAsema; static Reader[] vetReader = new Reader[7]; static Writer[] vetWriter = new Writer[3]; static boolean stopFlag = false; static boolean pauseFlag = false; //Construct the application public WritersHP() { Frame1 frame = new Frame1("WritersHP and Writers - Writers Have Priority"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setPreferredSize(new Dimension(800, 600)); //Validate frames that have preset sizes //Pack frames that have useful preferred size info, e.g. from their layout if (packFrame) frame.pack(); else frame.validate(); //Center the window Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); if (frameSize.height > screenSize.height) frameSize.height = screenSize.height; if (frameSize.width > screenSize.width) frameSize.width = screenSize.width; frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); frame.setVisible(true); MutexR = new Semaforo(1); MutexW = new Semaforo(1); WSema = new Semaforo(1); RSema = new Semaforo(1); QueueR = new Semaforo(1); TAsema = new Semaforo(1); readCount = 0; writeCount = 0; TAcount = 0; } public static void startProcess(){ //comeca o processamento. Foi criada uma classe aninhada para poder //liberar a classe chamadora deste método. Caso contrário a classe Frame1, //que é quem chama este método, fica presa nesse processamento e não //executa as chamadas feitas para a alteração dos campos de texto e de cor. Thread processo; Runnable r = new Runnable() { public void run() { double d; long a, b=0; int i; int rCount = 1; int wCount = 1; Frame1.limpaCampos(); while (! stopFlag){ //escolho um aleatório para definir que reader ou writer vai ser criado //Defini que tem que ser diferente do anterior pra evitar duas chamadas //consecutivas para o mesmo elemento, o que algumas vezes causava erro de estado //da thread, já que ela era criada mas não começava no mesmo momento, //causando uma dupla chamada ao start() do{ d = Math.random() * 10; a = Math.round(d); if (a == 10) a = 9; }while (a == b); b = a; if (a < 7){ if (vetReader[(int)a] != null){ if (! vetReader[(int)a].isAlive()){ vetReader[(int)a] = new Reader(MutexR, MutexW, WSema, RSema, QueueR, TAsema, (int)a, rCount); vetReader[(int)a].start(); rCount++; } } else{ vetReader[(int)a] = new Reader(MutexR, MutexW, WSema, RSema, QueueR, TAsema, (int)a, rCount); vetReader[(int)a].start(); rCount++; } } else{ if (vetWriter[((int)a) - 7] != null){ if (! vetWriter[((int)a) - 7].isAlive()){ vetWriter[((int)a) - 7] = new Writer(MutexR, MutexW, WSema, RSema, QueueR, TAsema, ((int)a) - 7, wCount); vetWriter[((int)a) - 7].start(); wCount++; } } else{ vetWriter[((int)a) - 7] = new Writer(MutexR, MutexW, WSema, RSema, QueueR, TAsema, ((int)a) - 7, wCount); vetWriter[((int)a) - 7].start(); wCount++; } } try { do{ Thread.sleep(500); }while (pauseFlag); } catch (InterruptedException e) {} } } }; //inicia o processo de criação de elementos stopFlag = false; processo = new Thread(r); processo.start(); } public static void stopProcess(){ //para a execucao geral através da parada da criação de novos readers e writers. stopFlag = true; } public static void setPauseProcess(boolean status){ //pausa a execucao geral para que possamos ter uma "foto" do processamento em um dado momento. pauseFlag = status; } public static boolean getPauseFlag(){ return pauseFlag; } public static void incWriteCount(){ writeCount++; } public static void decWriteCount(){ writeCount--; } public static int getWriteCount(){ return writeCount; } public static void incReadCount(){ readCount++; } public static void decReadCount(){ readCount--; } public static int getReadCount(){ return readCount; } public static void incTACount(){ TAcount++; } public static void decTACount(){ TAcount--; } public static int getTACount(){ return TAcount; } //Main method public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { } new WritersHP(); } }