package concorrencia; public class Writer extends Thread{ int Ref; int Nome; Semaforo MutexR, MutexW; Semaforo WSema, RSema, QueueR; Semaforo TAsema; public Writer(Semaforo pMutexR, Semaforo pMutexW, Semaforo pWSema, Semaforo pRSema, Semaforo pQueueR, Semaforo pTAsema, int pRef, int pNome) { MutexR = pMutexR; MutexW = pMutexW; WSema = pWSema; RSema = pRSema; QueueR = pQueueR; TAsema = pTAsema; Ref = pRef; Nome = pNome; } public void run(){ TAsema.down(); WritersHP.incTACount(); Frame1.setTAtext("" + WritersHP.getTACount()); TAsema.up(); Frame1.setLabelText(Ref+7, Nome); // AtualizaDados; /* Atualiza dados a serem gravados */ Frame1.setWriterText(Ref, "Preparando dados para gravação...",2); try { Thread.sleep(500); } catch (InterruptedException e) {} Frame1.setWriterText(Ref, "Bloqueado na RC de escritores...",2); MutexW.down(); /* Região Crítica para atualizar writeCount */ WritersHP.incWriteCount(); if (WritersHP.getWriteCount() == 1){ Frame1.setWriterText(Ref, "Bloqueando fila de leitores...",2); RSema.down();/* Indica entrada do primeiro Escritor */ } Frame1.setWriterText(Ref, "Liberando RC de escritores...",2); MutexW.up(); Frame1.setWriterText(Ref, "Bloqueando fila de escritores...",2); WSema.down(); /* Região Crítica para gravação do DataBase */ // WriteDataBase; /* Grava dados no Database */ Frame1.setWriterText(Ref, "Gravando no Database...",1); try { do{ Thread.sleep(1000); }while (WritersHP.getPauseFlag()); //se pauseFlag for true então o processo fica bloqueado neste ponto. Como apenas //um processo pode acessar essa região crítica, então as demais threads irão ficar //bloqueadas nos semáforos em que estão. Quando pauseFlag voltar a ser false, //esse processo irá continuar e liberar os semáforos normalmente. } catch (InterruptedException e) {} Frame1.setWriterText(Ref, "Liberando fila de escritores...",2); WSema.up(); Frame1.setWriterText(Ref, "Bloqueado na saída - RC de escritores...",2); MutexW.down(); /* Região Crítica para atualizar writeCount */ WritersHP.decWriteCount(); if (WritersHP.getWriteCount() == 0){ RSema.up(); /* Indica saída do último Escritor */ } MutexW.up(); Frame1.setWriterText(Ref, "Processamento finalizado...",3); TAsema.down(); WritersHP.decTACount(); Frame1.setTAtext("" + WritersHP.getTACount()); TAsema.up(); } /* public void processStop(){ pauseFlag = true; } public void processResume(){ pauseFlag = false; } */ }