Dúvida com threads

1 resposta
R

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.

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
Minha implementação
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

1 Resposta

eltonk

Qual é o probleminha? :razz:

Criado 17 de abril de 2005
Ultima resposta 29 de abr. de 2005
Respostas 1
Participantes 2