Arvutiteaduse instituut
  1. Kursused
  2. 2024/25 kevad
  3. Objektorienteeritud programmeerimine (LTAT.03.003)
EN
Logi sisse

Objektorienteeritud programmeerimine 2024/25 kevad

  • Kodutööd ja praktikumid
  • Loengud
  • Kursuse korraldus
  • IDE juhend
  • Süvendusrühm
  • Silumisest

Lisamaterjalid 12

Virtuaalsed lõimed

Viimase nädala teemaks on mitmelõimelised programmid. Selles tutvustatakse tavalisi lõimi, aga alates Java versioonist 21 on olemas ka virtuaalsed lõimed. Üheks suurimaks erinevuseks on see, et tavalised lõimed on alati seotud kindla operatsioonisüsteemi lõimega. Virtuaalne lõim on seotud ainult siis, kui see aktiivselt teeb midagi. Seetõttu vajavad virtuaalsed lõimed vähem mälu ja on soositud olukordades, kus peab ootama näiteks kasutaja sisendit või andmebaasi vastust. Samas suurt arvutusjõudlust ja aega nõudvaid operatsioone on mõistlikum hallata tavaliste lõimedega.

Virtuaalse (ja tavalise) lõime meetodid asuvad klassis Thread, millel on meetodid:

  • ofVirtual – klassimeetod virtuaalse lõime loomiseks. Seda käivitatakse meetodiga start. Tavalistel lõimedel eksisteerib analoogne meetod ofPlatform;
  • startVirtualThread – klassimeetod, mis loob ja käivitab virtuaalse lõime. See on võrdväärne käsuga Thread.ofVirtual().start(käsk);
  • isVirtual – tagastab tõeväärtuse sellest, kas lõim on virtuaalne.

Lõime tüüp ei mõjuta arvutamise kiirust, aga virtuaalsete lõimede loomine ja nendes operatsioonide järgi ootamine on efektiivsem. Väite kinnitamiseks loome klassi Ootaja, millel on meetod run. Selles jäljendatakse ootamist meetodiga sleep. Testimiseks kasutatakse klassi OotajaTest, milles luuakse 50000 virtuaalset või tavalist lõime. Iga lõim käivitab klassi Ootaja meetodi run. Kiiruse mõõtmiseks fikseeritakse aeg enne ja pärast lõimede loomist meetodiga System.currentTimeMillis. Tähtis on arvestada sellega, et lõimede töö võib lõppeda erinevatel aegadel ja programmi lõppemiseks ei pea olema virtuaalse lõime töö läbi. Seetõttu kasutatakse igal lõimel meetodit join, mis kindlustab töö lõppemist ja mõõtmise korrektsust.

public class Ootaja implements Runnable {
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

class OotajaTest {
    public static void main(String[] args) throws InterruptedException {
        long algus = System.currentTimeMillis();

        Ootaja lugeja = new Ootaja();
        List<Thread> lõimed = new ArrayList<>();

        for (int i = 0; i < 50000; i++) {
            Thread lõim = Thread.ofVirtual().start(lugeja);
            //Thread lõim = Thread.ofPlatform().start(lugeja);
            lõimed.add(lõim);
        }
        for (Thread lõim : lõimed) {
            lõim.join();
        }

        long lõpp = System.currentTimeMillis();
        long aegKokku = lõpp - algus;
        System.out.println("Aega kulus " + aegKokku + " ms");
    }
}

50000 virtuaalse lõime loomine ja käivitamine (sülearvutis HP EliteBook 840 G8) võtab aega keskmiselt 1800 ms. Kasutades tavalisi lõimi kulub selleks umbes 13000 ms.

Enesekontroll

  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused