mummy Δημοσ. 22 Αυγούστου 2010 Δημοσ. 22 Αυγούστου 2010 Γεια σας Έχω τις εξής κλάσεις σε Java και θέλω να κάνω τα εξής. Θέλω η BaseCommunicationAgent να ασχολείται με τα network θέματα, όπως connectios, readObject κτλπ. Σε αυτή την κλάση ένα thread ασχολείται μόνο με το να περιμένει μυνήματα με την readObject() σε ένα loop. Θα ήθελα να γίνεται το loop στην SampleCommunicationAgent1, και όχι στην run() όπως γίνεται τώρα, στο οποίο να καλείται μια συνάρτηση η οποία αν επιστρέφει ένα μύνημα αν υπάρχει και τίποτα άλλο. Το θέμα μου είναι με το thread. H run είναι void όποτε δεν μπορώ να την καλέσω αν μου επιστρέφει κάτι. Πως θα μπορέσω να πάρω κάτι από την μέθοδο πχ getMessage() και ταυτοχρόνα το thread να ασχολείται με το readObject(). Μια λύση είναι να κάνω implement την Runnable στην SampleCommunicationAgent1 αλλά δεν θέλω να ασχολήται ούτε με thread. Θέλω να είναι όσο απλή γίνεται. Ο κώδικας που έχω κάνει post είναι πολυ draft. Αν δεν έγινα κατανοητός ζητώ συγνώμη και οποιοδήποτε σχόλιο για τον κώδικα ευπροσδεκτός, Ευχαριστώ εκ των προτέρων για τον χρόνο σας. > // Some imports public class BaseCommunicationAgent extends BaseAgent implements Runnable { private Socket socket; private ObjectOutputStream dataOut; private ObjectInputStream dataIn; public BaseCommunicationAgent(String name) { super(name); } protected synchronized void connectToACS(String address, int port) throws IOException { try { socket = new Socket(address, port); dataIn = new ObjectInputStream(socket.getInputStream()); dataOut = new ObjectOutputStream(socket.getOutputStream()); new Thread(this).start(); } catch (IOException e) { e.printStackTrace(); } } protected synchronized void closeConnectionWithACS() { try { dataOut.flush(); dataOut.close(); dataIn.close(); socket.close(); } catch (IOException ex) { ex.printStackTrace(); } } protected synchronized void sendMessage(KQML message) { } protected synchronized KQML getMessage() { return message; } public void run() { try { KQML message; while (true) { //Το loop θα ήθελα να φύγει από εδώ //αφου ασχολείται η SampleCommunicationAgent1 με αυτό message = (KQML) dataIn.readObject(); //Do something } } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } και > //Some imports public class SampleCommunicationAgent1 extends BaseCommunicationAgent { public SampleCommunicationAgent1(String name) { super(name); } public static void main(String[] args) { SampleCommunicationAgent1 agent = new SampleCommunicationAgent1( "Tester"); try { agent.connectToACS("127.0.0.1", 3333); KQML message; while(true) { message=getMessage() // Κάτι τέτοιο θέλω. //Do something } } catch (IOException e) { e.printStackTrace(); } } }
mummy Δημοσ. 22 Αυγούστου 2010 Μέλος Δημοσ. 22 Αυγούστου 2010 Γεια σας Έχω τις εξής κλάσεις σε Java και θέλω να κάνω τα εξής. Θέλω η BaseCommunicationAgent να ασχολείται με τα network θέματα, όπως connectios, readObject κτλπ. Σε αυτή την κλάση ένα thread ασχολείται μόνο με το να περιμένει μυνήματα με την readObject() σε ένα loop. Θα ήθελα να γίνεται το loop στην SampleCommunicationAgent1, και όχι στην run() όπως γίνεται τώρα, στο οποίο να καλείται μια συνάρτηση η οποία αν επιστρέφει ένα μύνημα αν υπάρχει και τίποτα άλλο. Το θέμα μου είναι με το thread. H run είναι void όποτε δεν μπορώ να την καλέσω αν μου επιστρέφει κάτι. Πως θα μπορέσω να πάρω κάτι από την μέθοδο πχ getMessage() και ταυτοχρόνα το thread να ασχολείται με το readObject(). Μια λύση είναι να κάνω implement την Runnable στην SampleCommunicationAgent1 αλλά δεν θέλω να ασχολήται ούτε με thread. Θέλω να είναι όσο απλή γίνεται. Ο κώδικας που έχω κάνει post είναι πολυ draft. Αν δεν έγινα κατανοητός ζητώ συγνώμη και οποιοδήποτε σχόλιο για τον κώδικα ευπροσδεκτός, Ευχαριστώ εκ των προτέρων για τον χρόνο σας. > // Some imports public class BaseCommunicationAgent extends BaseAgent implements Runnable { private Socket socket; private ObjectOutputStream dataOut; private ObjectInputStream dataIn; public BaseCommunicationAgent(String name) { super(name); } protected synchronized void connectToACS(String address, int port) throws IOException { try { socket = new Socket(address, port); dataIn = new ObjectInputStream(socket.getInputStream()); dataOut = new ObjectOutputStream(socket.getOutputStream()); new Thread(this).start(); } catch (IOException e) { e.printStackTrace(); } } protected synchronized void closeConnectionWithACS() { try { dataOut.flush(); dataOut.close(); dataIn.close(); socket.close(); } catch (IOException ex) { ex.printStackTrace(); } } protected synchronized void sendMessage(KQML message) { } protected synchronized KQML getMessage() { return message; } public void run() { try { KQML message; while (true) { //Το loop θα ήθελα να φύγει από εδώ //αφου ασχολείται η SampleCommunicationAgent1 με αυτό message = (KQML) dataIn.readObject(); //Do something } } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } και > //Some imports public class SampleCommunicationAgent1 extends BaseCommunicationAgent { public SampleCommunicationAgent1(String name) { super(name); } public static void main(String[] args) { SampleCommunicationAgent1 agent = new SampleCommunicationAgent1( "Tester"); try { agent.connectToACS("127.0.0.1", 3333); KQML message; while(true) { message=getMessage() // Κάτι τέτοιο θέλω. //Do something } } catch (IOException e) { e.printStackTrace(); } } }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.