HecKel Posted December 3, 2006 at 05:12 PM Report #68479 Posted December 3, 2006 at 05:12 PM 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. Look Left Blog
Knitter Posted December 3, 2006 at 08:20 PM Report #68531 Posted December 3, 2006 at 08:20 PM ... 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?
HecKel Posted December 3, 2006 at 10:07 PM Author Report #68563 Posted December 3, 2006 at 10:07 PM 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 Look Left Blog
Knitter Posted December 4, 2006 at 12:00 AM Report #68598 Posted December 4, 2006 at 12:00 AM 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.
HecKel Posted December 5, 2006 at 12:49 AM Author Report #68838 Posted December 5, 2006 at 12:49 AM 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 Look Left Blog
Knitter Posted December 5, 2006 at 08:55 PM Report #69010 Posted December 5, 2006 at 08:55 PM 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 😉
HecKel Posted December 5, 2006 at 09:28 PM Author Report #69025 Posted December 5, 2006 at 09:28 PM 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 Look Left Blog
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now