Du sender en reference til de data der skal deles med over i constructoren til thread klassen, constructoren gemmer den og så kan run metode bruge den reference.
Og ved brug af:
synchronized(variabel) { ... }
omkring kritiske kode sektioner undgår du samtidigheds problemer.
Har prøvet noget i den retning men ved ikke om det er helt rigtigt
class ClientListenThread extends Thread { public Messages messages; public ClientListenThread(Socket socket, Messages msgs) { messages = msgs; // her skulle messages så blive gemt this.socket = socket; try { socketIn= new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch(IOException e) { } }
public synchronized void run() { String input; try { while(true) { input = socketIn.readLine(); // Just take the input aMsg = aMsg.stringAsMessage(input); synchronized(messages) { messages.putMessage(aMsg); } } } catch(IOException e) { } }
Når jeg så starter tråden gør jeg det med: receiveThread = new ClientListenThread(socket, messages); receiveThread.start();
I denne funktion der ligger i min "hovedklasse" skal jeg så bruge og slette lidt i de messages: public synchronized boolean getAMessage() { if(messages.size()>0) { aMsg = messages.getMessage(0); messages.removeElementAt(0); return true; } else return false; }
det er garanteret ikke det store der er galt.. bare mig der gør det forkert :/
Okay. variablerne er erklærede :) den aMsg = aMsg.stringAsMessage(input); er nok også lidt "dumt" lavet.. det er for at jeg kan sende en message gennem sockets. den burde så nok ikke lige have være lavet i Message classen :)
hmm jeg får dem ikke overført.. hvis du lige vil se erklæringerne kommer de her: her er de i "hovedklassen: static Messages messages; static Message aMsg;
og i threaden: public Messages messages; private Message aMsg;
der er garanteret noget der der er galt :) kan bare ikke lige helt overskue det
public class ChatApplet extends java.applet.Applet{ static String chatname; static long chatid; static String serverip; static Socket socket; static BufferedWriter socketOut; static ClientListenThread receiveThread; static Messages messages = new Messages(); static Message aMsg;
public boolean connect() { try { socket = new Socket(InetAddress.getByName(serverip),1000); socketOut = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())); receiveThread = new ClientListenThread(socket); receiveThread.start(); return true; }
Min ClientListenThread lytter efter beskeder fra serveren og smider dem ind på messages. ChatApplet skal så hvergang getAMessage() kaldes, ta den første message i rækken og lægger den over i aMsg. derfra kan jeg så få de enkelte værdier over i min javascript kode som også hører til. Jeg ved at selve min ChatApplet virker, da jeg har prøvet selv at lægge messages på listen og så hive dem ud derfra.
Jeg har snart prøvet alle mulige kombinationer og kan ikke få det til at virke.. håber du forstår hvad jeg mener. Mvh /Tand
nåh.. har fundet ud af det alligevel ikke var der fejlen var.. :) undskyld besværet.. det er min socket connection der går galt et eller andet sted istedet :(
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.