webForumDet fria alternativet

Bättre sätt att ta emot data

2 svar · 265 visningar · startad av nitro2k01

nitro2k01Medlem sedan aug. 20039 342 inlägg
#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?

spangoMedlem 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.

ViktorMedlem 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

130 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)