package concorrencia; public class Reader extends Thread { boolean pauseFlag = false; int Ref; int Nome; Semaforo MutexR, MutexW; Semaforo WSema, RSema, QueueR; Semaforo TAsema; public Reader(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, Nome); Frame1.setReaderText(Ref, "Bloqueado na entrada dos leitores...",2); QueueR.down(); Frame1.setReaderText(Ref, "Bloqueado na fila de leitores...",2); RSema.down(); /* Bloqueia Leitor Enquanto houver Escritor */ Frame1.setReaderText(Ref, "Bloqueado na RC de leitores...",2); MutexR.down(); /* Região Crítica para atualizar readCount */ WritersHP.incReadCount(); if (WritersHP.getReadCount() == 1){ Frame1.setReaderText(Ref, "Bloqueando fila de escritores...",2); WSema.down();/* Indica entrada do primeiro Leitor */ } Frame1.setReaderText(Ref, "Liberando a RC de leitores...",2); MutexR.up(); Frame1.setReaderText(Ref, "Liberando fila de leitores...",2); RSema.up(); Frame1.setReaderText(Ref, "Liberando entrada de leitores...",2); QueueR.up(); // ReadDataBase; /* Lê dados do DataBase */ Frame1.setReaderText(Ref, "Lendo 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.setReaderText(Ref, "Bloqueado na saída - RC de leitores...",2); MutexR.down(); /* Região Crítica para atualizar readCount */ WritersHP.decReadCount(); if (WritersHP.getReadCount() == 0){ Frame1.setReaderText(Ref, "Liberando fila de escritores...",2); WSema.up(); /* Indica saída do último Leitor */ } MutexR.up(); // ProcessaDados; /* Processa dados lidos */ Frame1.setReaderText(Ref, "Processando dados lidos...",2); try { Thread.sleep(500); } catch (InterruptedException e) {} Frame1.setReaderText(Ref, "Processamento finalizado...",3); TAsema.down(); WritersHP.decTACount(); Frame1.setTAtext("" + WritersHP.getTACount()); TAsema.up(); } /* public void processStop(){ pauseFlag = true; } public void processResume(){ pauseFlag = false; } */ }