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?
#1kucape2
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.
#3Kit
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ší.
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:
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áš.