Proc nefunguje tento kod – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Proc nefunguje tento kod – Java – Fórum – Programujte.comProc nefunguje tento kod – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
kucape20
Newbie
24. 1. 2016   #1
-
0
-

Zdravím,

mám následující kód:

DataInputStream in;
String data;

private void listen() {

        while (true) {
            
            if(in==null)
                continue;
            
            try {
                    data = in.readUTF();                
            } catch (IOException ex) { }
    }
}

Jedná se o funkci která naslouchá Data Input Streamu. Protože to ale spouštím ve vláknech tak musím kontrolovat jestli proměnná in není null. Zjistil jsem že nefunguje správně.

Když tam nechám jenom  

if(in == null)
    continue;

tak to nefunguje, ale když přidám uspání vlákna, pracuje správně

if(in == null) {
	Thread.sleep(1);
	continue;
}

Zajímalo by mě čím je způsobené že to bez uspaní nefunguje a s uspáním ano?

Nahlásit jako SPAM
IP: 90.180.160.–
Kit+15
Guru
24. 1. 2016   #2
-
0
-

#1 kucape2
Bez uspání tam máš nekonečný cyklus, který ti sežere výkon procesoru pro sebe a ostatním vláknům nedá šanci. Je to hodně špatný způsob, který vybíjí baterky.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
24. 1. 2016   #3
-
0
-

#1 kucape2
Proč místo ošetření zahazuješ výjimku IOException?

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
kucape20
Newbie
24. 1. 2016   #4
-
0
-

#3 Kit
Ano já vím, ale proč to nevyskočí z toho cyklu jakmile je in inicializovaný? V dalším vlákně mám:

        while (true) {                
            try {
                client = server.accept();

                in = new DataInputStream(client.getInputStream());
                out = new DataOutputStream(client.getOutputStream());
                                
                out.writeUTF("Server: send test ");
                
            } catch (IOException ex) {
		// ošetření vyjímky                
            }
        }

Mám ji oštřenou, jenom to tady nepíšu aby to bylo přehlednější.

Nahlásit jako SPAM
IP: 90.180.160.–
Kit+15
Guru
24. 1. 2016   #5
-
0
-

#4 kucape2
A proč by měl z toho cyklu vyskočit? Ten cyklus je prostě nekonečný bez možnosti ukončení.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
kucape20
Newbie
24. 1. 2016   #6
-
0
-

#5 Kit

Pardon, ne z cyklu ale z té podmínky if. Zkrátka, dokud není proměnná in inicializovaná tak se volá pořád dokola nová iterace (continue), toto běží v vlákně A. Ve vlákně B zase běží kód, který jsem popsal výše, tam se inicializuje proměnná in. Teďka bych čekal, že se ve vlákně A vyhodnotí if (in==null) jako false a bude pokračovat kódem:

try {
	data = in.readUTF();                
} catch (IOException ex) { }

Ježne to se nestane pokud do if nepřidám Thread.sleep(..)

Nahlásit jako SPAM
IP: 90.180.160.–
q
~ Anonymní uživatel
219 příspěvků
25. 1. 2016   #7
-
0
-

Hodnota in může být cachovaná, tj. hodnota té proměnné se načte jen jednou.

Nevím, proč ti to se sleep funguje a jestli je to zrovna tím, ale nespoléhal bych na to. (V Java SE je řečeno, že sleep nemusí aktualizovat hodnoty. Nevím, jak jinde.)

Můžeš tu proměnnou udělat volatile a pak by se to mělo chovat, tak ja čekáš.

Nahlásit jako SPAM
IP: 213.211.51.–
kucape20
Newbie
25. 1. 2016   #8
-
0
-

#7 q

Ano to je přesně to co hledám, Díky

Nahlásit jako SPAM
IP: 90.180.160.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 47 hostů

Podobná vlákna

Co znamena tento kod? — založil Tayson

Prečo mi tento zdroj nefunguje? — založil Timeshifter

Proč to nefunguje — založil Radim Krsička

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý