webForumDet fria alternativet
Logga in / Bli medlem

Bättre sätt att ta emot data

Java

2 svar · 265 visningar · startad av nitro2k01

Medlem sedan aug. 20039 340 inlägg
Frågan#1

Jag har följande kod för att läsa input från en DataInputStream.

while(true){
	try{
	  	dtClientConsole.outWrite(
			inputStream.readUTF()
		);
	}catch(IOException e){
		Thread.yield();
	}
}

Problemet är att denna kod tar upp för mycket CPU-kraft. Trots att jag kör Thread.yield(); (Den kallas oftast eftersom det i de allra flesta fallen inte finns någon data att läsa.) och har prövat att sätta trådens prioritet till lägsta, så tar den fortfarande lika mycket CPU.
dtClientConsole är en instans av en klass som jag har skrivit för att skriva till konsolen, och den är inte orsaken. (Jag har prövat att sätta inputStream.readUTF(); ensamt med samma resultat.)

Jag undrar om det finns något sätt att låta tråden sova tills det kommer nätverksdata?
Det är viktigt att datan tas emot direkt när den kommer, för jag vill undvika latency, men tycker samtidigt att det verkar dumt att vänta i en while(true)-loop. ("Dumbloop" som det kallas.)

Förslag?

Medlem sedan juni 20008 205 inlägg
#2

Konstigt. java.io-paketet kör bara med blocking I/O, readUTF borde blocka tills den läst ett tecken.

Medlem sedan aug. 20021 752 inlägg
#3

Vet inte om det hjälper något men eftersom jag ändå sitter och jobbar med nätverk just nu så kan jag ju slänga in min kod (moddad för dig) som jag alltid använder när jag behöver en lysnare på en socket,

class KAlle
{
	public static void main(String args[])
	{
		//öppna socket osv
		Listen l=new Listen();
		l.start();
	}

	class Listen extends Thread
	{
		public void run()
		{
			try
			{
				String line="";
				while((line=inputStream.readUTF())!=null)
				{
					dtClientConsole.outWrite(line);
				}
			}
			catch(IOException io)
			{
				io.printStackTrace();
			}
		}
	}
}

/Viktor

268 ms totalt · 4 externa anrop · v20260731065814-full.0bc6e834
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
132 ms — ändringar (db)