• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

HecKel

Dúvida com threads

7 mensagens neste tópico

Boas!

Estou a fazer um trabalho para a faculdade e necessitados de usar algumas threads...

Basicamente o trabalho é algo como um IRC limitado...

Algures no trabalho necessitámos de criar uma thread para ir recebendo dados do servidor, só que precisamos de aceder a estes dados no programa principal, sugestões?

Aqui ficam as funções deste problema:

(...)
public class VChatClient implements ChatProcessor {
(...)
public List<String> getChatNames() {
	List<String> list = new ArrayList<String>();
	// TODO Completar codigo
	ChatRooms cr = new ChatRooms();
	cr.doit();
	// ------
	System.out.println( "Obter lista de nomes");
	return cr.getChannels();
}
(...)
class ChatRooms implements Runnable {

	// sala - hora
	private Map<String, Long> chanmap;
	private long timeout = 5000;

	public void run() {
		try{
			MulticastSocket receiver = new MulticastSocket(9500);
			receiver.joinGroup(InetAddress.getByName("255.0.0.0"));
			for(; {
				byte[] buf = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buf, buf.length);
				receiver.receive(dp);
				String channels = new String(dp.getData(), 0, dp.getLength());
				String[] chanarray = channels.split(";");
				chanmap = new HashMap<String, Long>();
				for(int i = 0; i < channels.length(); i++)
					chanmap.put(chanarray[i], System.nanoTime());
			}
		} catch (IOException e)
		{}
	}

	public void doit() {
		Thread t = new Thread(this) ;
		t.start();
	}

	public List<String> getChannels() {
		Iterator<Entry<String, Long>> it = chanmap.entrySet().iterator();
		List<String> list = new ArrayList<String>();

		while(it.hasNext()) {
			Entry<String, Long> ent = it.next();
			if((System.nanoTime() - ent.getValue()) > timeout)
				chanmap.remove(ent.getKey());
			else
				list.add(ent.getKey());
		}
		return list;
	}
}
}

A classe ChatRooms é nested class.

Sugestões agradecem-se :)

abraços, HecKel

PS: É provavel que este bloco de código ainda tenha erros, nem foi testado, ignorem esses erros. Para já apenas quero saber como resolver isto das threads, sff.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
... só que precisamos de aceder a estes dados no programa principal, sugestões?

As tuas threads podem ter referencia para o programa principal, ou algum dos seus componentes, e invocarem métodos e/ou actualizarem estruturas de dados. Outra solução é a das tuas threads terem métodos que permitam aceder aos dados que precisas e no programa principal teres uma estrutura que guarde todas as threads, desta forma acedes quando quiseres aos dados que precisas.

Já agora porque é que tens uma Nested Class? Há alguma razão pela qual a classe ChatRooms não possa existir sem a tua classe VChatClient?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda não testei, mas da forma como tenho o selector deveria dar aceder ao conteúdo da thread..., mas tenho receio de não ser tão trivial como estou a fazer...

Sobre as Nested Class, basicamente é uma questão de organização. As nested classes que estou a usar só têm mesmo sentido naquelas classes e uma forma de não me trocar todo com muitos ficheiros ou muitas classes dentro de um só ficheiro é não misturar alhos com bugalhos :) Tendo em conta que estando separada, a classe não tem qualquer sentido julgo que o mais acertado será mesmo estar como nested class.

Obrigado pela ajuda ;)

abraços, HecKel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Tendo em conta que estando separada, a classe não tem qualquer sentido julgo que o mais acertado será mesmo estar como nested class

Então não consideras fazer sentido eu conseguir usar a classe ChatRooms com um player diferente? Isso parece má reutilização de código ;).

Não tomei muita atenção ao teu código, gosto mais de ver código dentro do meu netbeans :), amanha de manha vou dar uma olhadela melhor e responder-te com mais calma e tentar ser mais útil, a resposta anterior não foi muito útil... enfim. A questão das nested classes nã é importante mas pode facilitar/atrapalhar o resto do trabalho, mas como não tenho mais informação não me vou alongar sobre isso. Só uma nota, nested classes quebram um pouco a performance... não que neste caso notes muito, só para futura referência.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Segundo o meu professor compliquei aquilo que é fácil, pensei em threads como se fossem processos...

O meu código já estava teoricamente certo, agora resta-me testar :)

Obrigado pela ajuda ;)

abraços, HecKel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pensei em threads como se fossem processos...

Podes pensar como "processos leves", mas mesmo esta analogia não está correcta, transmite uma ideia errada.

São parecidos em muitas coisas mas diferentes em tantas outras. Bem ia ver com atenção o teu código, acordei agora e estava para ai virado, assim, vou jogar WOW ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

loooool :P

Sim, threads usam o mesmo pid, não são independentes e não se devem matar. Devem morrer naturalmente. Processos têm um pid diferente, não dependem do processo pai.

Eu compreendi mal a filosofia das threads, mas julgo que agora já estou lançado :) Se conseguir fazer o trabalho em condições depois apresento aqui a totalidade do código ;) (se a nota for boa :))

abraços, HecKel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora