Προς το περιεχόμενο

Thread And ReadObject()


mummy

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας

Έχω τις εξής κλάσεις σε 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();
	}

}

}

Δημοσ.

Γεια σας

Έχω τις εξής κλάσεις σε 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();
	}

}

}

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...