Java Threadübergreifendes Problem

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.107
Ich habe einen Console inputstreamreader und einen UDP streaminputreader. beide laufen auf einen separaten thread.

vielleicht habe ich ja falsch gemacht. bin kein threadguru.

Die Klasse A die für einlesen der consoleingaben zuständig ist ist mit dem thread der UDP input B verbunden. problem ist, dass ich sowohl die consoleneingabe als auch UDP nachrichten auswerten möchte. Ich möchte so wenige Thread wie möglich am laufen halten, deswegen habe ich auf einen 3ten thread verzichtet der die auswertung der eingaben übernimmt.

eventuell kann man so machen dass der thread der die eingaben verarbeitet schläft bis einer der beiden notify rausschickt dass den thread weckt und die daten bearbeiten lässt. ich muss dann auf jeden fall synrconized machen. habe das aber noch nie gemacht.

hmm wenn ich mir so genau überlege dass ist die idee mit 2 thread doch schlecht. also 3 threads... aber ich habe keine ahnung wie man das realisieren kann. in google würde ich selbst versuchen aber mir fallen keine stichwörter dazu ein.

kann da vielleicht jemand aushelfen?

danke


ich habe die lösung gefunden denke ich.... falls jemand wissen will schreibe ich auch rein
 
Zuletzt bearbeitet:
Natürlich wollen wir das wissen.

Typische Stichwörter Thread Synchronisierung:
"Mutex" (Mutual Exclusion Object) oder "Semaphore" verwenden, C# kennt dann noch "System.Threading.Monitor", je nachdem was du für eine Sprache verwendest
 
Naja ich schreibe ja in JAVA und nicht in C#

auf jeden Fall geht es folgendermassen.

zuerst brauche ich eine Klasse die Threadfähig ist für die Consoleninput
danach brauche ich eine Klasse die den UDP verkehr abhört und auch threadfähig.

zuletzt benutze ich die Klasse die den ganzen Verkehr abhören kann.

UDP LISTEN
Code:
	public Receive(Commands c) throws Exception
	{
		this.debugging = true;
		if(c != null)
		{
			this.c = c;
		}else
		{
			throw new Exception("Cannot Use empy Class Commands. Please be ensure that " + this.getClass().getName() + "received legal Commands Class");
		}
		SocketStatus = InitSocket();
	}

	private void Init_Listen()
	{		
		while(SocketStatus)
		{
			
			try {
				this.writeline("Wait for a new incoming Packet...", 9);
				DatagramPacket P2PPacket = new DatagramPacket(P2PInputStream, P2PInputStream.length);
				P2PSocket.receive(P2PPacket);
				
				System.out.println("new Message Received:");
				
				P2PINet = P2PPacket.getAddress(); 
				byte[]      data    = P2PPacket.getData();
				
				InMessage			= new String(data, 0, len );
				[COLOR="Red"]
				synchronized (c)
				{
					c.InterpretCommand(InMessage, 0);
				}
				[/COLOR]
				
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				e.getCause();
				System.exit(0);
			}
		}
		if(!SocketStatus)
		{
			this.ResetAll();
			System.out.println("Init Socket Fails. Programm Exiting now");
			System.exit(0);
		}
	}

CONSOLE LISTEN

Code:
	public ConsoleInput(Commands c) throws Exception
	{
		if(c == null)
		{
			throw new Exception("Cannot Use empy Class Commands. Please be ensure that " + this.getClass().getName() + "received legal Commands Class");
		}else
		{
			this.c = c;
		}
		
	}

	@Override
	public void run()
	{
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		while(true)
		{
			try
			{
				if(input.isEmpty())
				{
					input = in.readLine();
                                        [COLOR="Red"]
					synchronized (c)
					{
						c.InterpretCommand(input, 1);
					}
                                        [/COLOR]
					input = "";
				}
			}catch (Exception e)
			{
				e.printStackTrace();
				System.exit(1);
			}
		}
	}

0 und 1 bei InterpretCommand heisst nur dass es entweder console oder UDP packet ist.

Letztendlich entscheided InterpretCommand was als nächstes gemacht werden sollte.

ich gebe dafür keine garantie, weil ich es nicht austesten konnte aber im prinzip sollte es klappen.
 
Zurück
Oben