tifyty

pure Java, what else ?

Nem jön álom a szememre

Van a Thread osztályban egy sleep() metódus. Statikus, szál példány nélkül meg lehet hívni, és arra való, hogy aludjon egy kicsit a szál. Kb annyi miliszekundumot, amennyit megadtunk argumentumként. De ugye egy miliszekundum nagyon hosszú idő, az alatt sok százezer utasítást is végre tud hajtani a processzor. Nem biztos, hogy ilyen hosszan altatni akarunk egy szálat, nem Csipkerózsika az.

De nem is kell, hiszen ott van a másik statikus metódus, neve szintén sleep, testvére az elsőnek, két argumentummal. Az első argumentum továbbra is a miliszekundumok száma, a második pedig a nano szekundumoké. Így már nanoszekundum pontossággal megadhatjuk, hogy mit szeretnénk, mennyit aludjon a szálunk.

És valójában mennyit fog? Hát vagy annyit, vagy kevesebbet, vagy többet. Nincs semmire garancia. Ahogy meghívhatod a System.gc()-t is. Az is csak annyit mond, hogy ezzel a hívó kifejezte azon véleményét, hogy egy kis szemétgyűjtés éppen mehetne. Hogy megy-e? Azt majd a VM eldönti. Olyan ez, mint a szomszédaim a panelban, akik mindig jó zenét hallgatnak. Akár tetszik nekik, akár nem. A programok is mindig jókor gyűjtik a szemetet, a VM megszavazza, mikor. Hát az alvással is így van. Így aztán, amikor OSX alatti Java 7 JDK-ból megláttam az alábbi metódust, csak elcsodálkoztam. Nem gondolom, hogy bug lenne, hiszen a specifikációt teljesíti: vagy aludni fog, vagy nem. Vagy annyit, vagy nem. Vagy többet, vagy kevesebbet. De azért…

public static void sleep(long millis, int nanos)
    throws InterruptedException {
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
            millis++;
        }

        sleep(millis);
    }

A kód review mértékegysége a WTF per metódus. Azért a JDK-t olvasva is elsül egy-két WTF.

5 responses to “Nem jön álom a szememre

  1. ern0 január 9, 2013 12:37 du.

    Így biztos lesz valamennyi sleep, ami fontosabb, mint hogy mennyi. A sleep() a szegény ember yield()-je.

  2. Botond január 9, 2013 12:38 du.

    Na nem mintha illúziókat tápláltam volna eddig, de ez tényleg meghökkentő és kissé kiábrándító..

  3. tamasrev január 9, 2013 10:32 du.

    Ez így tényleg egy jó nagy WTF. Másrészt meg Ern0-nek teljesen igaza van: aki sleep()-et hív, az magára vessen: egy thread-et aludni küldeni drága dolog. Ha sleep() van a kódban, akkor itt az ideje a redesign-nak.

  4. István Benedek január 10, 2013 2:15 de.

    Május 1! Virsli, mustár, kenyér meg talán még egy sör is.. tolod mert jó! Aztán meg jönnek neked, miből van a virsli… Nem kell nekünk mindenről tudni… jobb az mindenkinek…:)

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: