Dúvida Thread

12 respostas
M

Caros,
Estou começando a estudar Thread.
E pensei em desenvolver uma programa para fixar o que eu aprendi.
O programa deve ler 3 arquivos txt que chamo de MG.txt, SP.txt e BA.txt em cada um deles contém uma lista de cidades.
A ideia é começar a imprimir a primeira lista, parar por um determinado tempo e começar a segunda, parar para um determinado tempo, continuar imprimindo a primeira lista…algo do tipo
mas o problema é que não sei como faço para executar isso no método run.
alguém tem alguma sugestão??

import java.io.*;

public class Estados implements Runnable
{
	String arquivo;

	
	public Estados(String a)
	{
		this.arquivo = a;
	}
	
	public static void main(String[] args) throws Exception 
	{	
		// lê o arquivo txt de cada estado
		Estados minas = new Estados("MG.txt");
		Estados bahia = new Estados("BA.txt");		
		Estados saopaulo = new Estados("SP.txt");	
		
		Thread t1 = new Thread(minas);
		Thread t2 = new Thread(bahia);		
		Thread t3 = new Thread(saopaulo);				
			
		// imprime a lista de cidades de cada estado
		minas.leitorTxt();				
		bahia.leitorTxt();				
		saopaulo.leitorTxt();
			
				
	}	

	
	public void leitorTxt()throws Exception 
	{
		BufferedReader buffer	= new BufferedReader(new FileReader(arquivo));				
		String temp = buffer.readLine();		
								
		System.out.println(temp);
						
		while (temp!=null)
		{
			System.out.println(temp);
			temp = buffer.readLine();
		}				
	}
	
	
	public void run() 
	{
	
				
	}
}

12 Respostas

ramilani12

Esse tempo de parar uma thread e rodar a outra é o sistema operacional que controla no Windows e Linux senão me engano é por tempo no Solaris é pro prioridade.

M

Raphael,
acho q vc não entendeu a minha dúvida.
é a seguinte o método leitorTxt deve ser chamado no método run??

ramilani12

Extamente o metodo de ler arquivo chame-o no metodo run , mas precisa “startar” as threads

Thread t1 = new Thread(minas);
 		Thread t2 = new Thread(bahia);		
 		Thread t3 = new Thread(saopaulo);

t1.start();
t2.start();
t3.start();
M

humm… mas como faço para o método lerTxt chamar o run???

ramilani12

Assim nao aceita?

public void run()

{

      leitorTxt();

}
M

não rola !!! :frowning:

furutani

Eu axo que deveria ser ao contrario, o metodo run chamar o metodo lerTxt.
Mas tudo bem

Qual é o erro?

ramilani12

Ué entao nao use o método leitorTxt() , coloque o algoritmo dentro do run()

public void run()
{

BufferedReader buffer	= new BufferedReader(new FileReader(this.arquivo));				
 		String temp = buffer.readLine();		
 								
 		System.out.println(temp);
 						
 		while (temp!=null)
 		{
 			System.out.println(temp);
 			temp = buffer.readLine();
 		}			

}
M

agora funcionou…veja como ficou
muito obrigada a todos

import java.io.*;


public class Estados implements Runnable
{
	String arquivo;
	int segundos;

	
	public Estados(String a, int segundos)
	{
		this.arquivo = a;
		this.segundos = segundos;
	}
	
	public static void main(String[] args) throws Exception 
	{	
		// lê o arquivo txt de cada estado
		Estados minas = new Estados("MG.txt",1000);
		Estados bahia = new Estados("BA.txt",2000);		
		Estados saopaulo = new Estados("SP.txt",3000);	
		
		Thread t1 = new Thread(minas);
		Thread t2 = new Thread(bahia);		
		Thread t3 = new Thread(saopaulo);				
			
		// imprime a lista de cidades de cada estado
		//minas.leitorTxt();				
		//bahia.leitorTxt();				
		//saopaulo.leitorTxt();
		
		t1.start();	
		t2.start();	
		t3.start();	
				
	}	
	
	public void leitorTxt()throws Exception 
 	{
 		BufferedReader buffer	= new BufferedReader(new FileReader(arquivo));				
 		String temp = buffer.readLine();		
 								
 						
 		while (temp!=null)
 		{
 			Thread.sleep(this.segundos);
 			System.out.println(arquivo + ": " +temp);
 			temp = buffer.readLine();
 		}				
 	}
 		
	
	
	public void run() 
	{
		try {
			this.leitorTxt();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
}
E

Ola, tava vasculhando a net e vi o tópico. Nem sei se é legal fazer isso mas aproveitei o mesmo pra fazer uma perguntinha pertinente ao assunto (especialmente a você, msmelos, que agora tem 2 anos de experiência hehe).

É o seguinte:

tenho uma espécie de servidor que se comunica de forma assincrona com um proxy e este por sua vez com thread com thread clientes.

Esquema:

cliente -> proxy -> servidor

Este retorna o resultado de solicitações feitas pelos clientes so que com o seguinte problema:

o cliente1 fez solicitacao 1;
o cliente2 fez solicitação 2;

so que as solictações podem demorar um tempo variável logo quando vem a resposta o proxy não sabe pra qual thread entregar.

Alguém saberia dizer se existe uma forma de marcar threads? Algo como atribuir indice à uma thread e na volta da resposta, esta teria setado o indice e assim saberia a quem entregar.

Se alguém souber…
desde já muito agradecida! > ‘,’ <

T

Use Executors (http://java.sun.com/javase/6/docs/api/java/util/concurrent/Executor.html ). Pense em Tasks, não em Threads.

E

Oi ,

brigada pela dica. Dei uma olhada no Executor e interpetei como se ele fosse o “gerenciador” das threads /*Estaria certo pensar nas mesmas como tarefas? ou você quis dizer que cada comportamento (as invocações dos métodos das mesmas) seriam as tarefas? */

Mas apesar disso, Penso que ele não vai resolver meu problema porque porque ele não atribui um índice, um ID às mesmas (qualquer identificador). Ou seja,
não tenho como fazer a solicitação ao servidor e esta ser marcada com o índice da thread que a solicitou para que na volta (volta da resposta) o executor saiba pra qual thread entregar a resposta.

Tenho esse problema porque não são as threads que solicitam ao servidor.

Estas solicitam ao proxy e ficam lá esperando. Aí o proxy repassa as solicitações para o servidor (te dando detalhes, na verdade o que chamo de servidor é um midleware de grades de computadores) e fica esperando a resposta.

Quando a resposta vem, sem está identificada (com o ID de quem solicitou), não há como o proxy repassa-la à thread certa. Você pode se perguntar pra que raios eu uso threads (porque não faco logo uma solicitação direta)? mas é que cada thread correponde a um dispositivo móvel que na realidade é quem está fazendo a solicitação. Preciso entregar a resposta pra o dispositivo certo.

Não sei se me fiz entender mas basicamente é isso. DEsculpa o jornal!!!
Mai uma vez Obrigada!
(> ^,^ <)

Criado 1 de dezembro de 2006
Ultima resposta 23 de out. de 2008
Respostas 12
Participantes 5