Olá pessoal, tô com um problema em utilizar threads.
Tô com um algoritmo simples da faculade, disciplina de Sistemas Operacionais, que utiliza threads e preciso implementá-lo em java.
Vou mandar o algoritmo e o .java que eu fiz
Valeu pela ajuda.
[code]ATIVIDADE DE SISTEMAS OPERACIONAI I
IMPLEMENTAR O ALGORITMO EM JAVA
Semáforos sem, rcr;
Inteiros r1=0, r2=0, i;
Booleanos fim=falso, t=falso;
Principal()
{
Inicialize sem = 1;
Inicialize rcr = 1;
Crie_Thread_Iniciando_Em(Rotina1);
Crie_Thread_Iniciando_Em(Rotina2);
Para i de 0 até 10 faça
{
Down(sem);
Imprima(i, r1, r2);
}
fim = verdadeiro;
}
Rotina1()
{
Durma(1); //Em segundos
Enquanto(não(fim))
{
Enquanto(não(t))
{
Down(rcr);
r1 = r1 + 1;
t = verdadeiro;
Durma(1);
Up(rcr);
}
}
}
Rotina2()
{
Durma(1); //Em segundos
Enquanto(não(fim))
{
Enquanto(t)
{
Down(rcr);
r2 = r2 + 1;
Up(sem);
t = falso;
Durma(1);
Up(rcr);
}
}
}
Obs: A instrução Down() decrementa e Up() incrementa;
Obs: Os semáforos não podem ser negativos. Quando chegam nesse valor, o thread que o decrementou é bloqueado e ele fica em 0
[/code]
Minha implementação
[code]public class ThreadSOI
{
private Object sem;
private Object rcr;
private int r1 = 0, r2 = 0;
boolean t = false, fim = false;
public ThreadSOI()
{
sem = new Object();
rcr = new Object();
ThreadRotina1 rotina1 = new ThreadRotina1("Rotina1");
ThreadRotina2 rotina2 = new ThreadRotina2("Rotina2");
//Dispara os dois Threads que executarão o método run() respectivo
rotina1.start();
rotina2.start();
for(int i = 0; i <= 10; i++)
{
//Representa o down(sem)
synchronized(sem)
{
System.err.println("Thread main() esperando \"sem\"");
//sem.notifyAll();
System.err.println("Variável \"i\": " + i + ", Variável \"r1\": " + r1 +
", Variável \"r2\": " + r2);
System.err.println("Tempo: " + System.currentTimeMillis() + " segundos.");
System.err.println("---------------------------------------------------------");
}
}
fim = true;
}
public static void main(String[] args)
{
System.err.println("Thread main() iniciada");
new ThreadSOI();
System.err.println("Thread main() acabada");
}
class ThreadRotina1 extends Thread
{
//Recebe um nome para o Thread e repassa para a superclasse
public ThreadRotina1(String nome)
{
super(nome);
}
public void run()
{
System.err.println("Rotina1 iniciada - Tempo: " +
System.currentTimeMillis() + " segundos");
rotina1();
System.err.println("Rotina1 acabada - Tempo: " +
System.currentTimeMillis() + " segundos");
}
public void rotina1()
{
try
{
Thread.sleep(1000);//O argumento é dado em milisegundos
while(!fim)
{
while(!t)
{
//Esse bloco representa o método Down(rcr) do exercício
synchronized(rcr)
{
System.err.println("Rotina1: Down(rcr) - Tempo: " +
System.currentTimeMillis() + " segundos");
r1++;
t = true;
ThreadRotina1.sleep(1000);
rcr.notify();//Representa o método Up(rcr) do exercício
System.err.println("Rotina1: Up(rcr) - Tempo: " +
System.currentTimeMillis() + " segundos" +
" Variável \"r1\" = " + r1);
}
}
//Fim do segundo while
}
//Fim do primeiro while
}
catch(InterruptedException e)
{
System.err.println("Rotina1 interrompida!");
e.printStackTrace();
}
}
}
//Fim class ThreadRotina1
class ThreadRotina2 extends Thread
{
//Recebe um nome para o Thread e repassa para a superclasse
public ThreadRotina2(String nome)
{
super(nome);
}
public void run()
{
System.err.println("Rotina2 iniciada - Tempo: " +
System.currentTimeMillis() + " segundos");
rotina2();
System.err.println("Rotina2 acabada - Tempo: " +
System.currentTimeMillis() + " segundos");
}
public void rotina2()
{
try
{
Thread.sleep(1000);//O argumento é dado em milisegundos
while(!fim)
{
while(t)
{
//Esse bloco representa o método Down(rcr) do exercício
synchronized(rcr)
{
System.err.println("Rotina2: Down(rcr) - Tempo: " +
System.currentTimeMillis() + " segundos");
r2++;
sem.notify();//Representa o método Up(sem) do exercício
t = false;
Thread.sleep(1000);
rcr.notify();//Representa o método Up(rcr) do exercício
System.err.println("Rotina2: Up(rcr) - Tempo: " +
System.currentTimeMillis() + " segundos");
}
}
//Fim do segundo while
}
//Fim do primeiro while
}
catch(InterruptedException e)
{
System.err.println("ThreadRotina2 interrompida!");
e.printStackTrace();
}
}
}
//Fim class ThreadRotina2
}
//Fim class ThreadSOI[/code]