Jump to content

Dúvida com threads


Recommended Posts

Posted

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.

Posted
... 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?

Posted

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

Posted
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.

Posted

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

Posted
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 😉

Posted

loooool 😛

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.