Dúvida com threads

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]

Qual é o probleminha? :razz: