Ohjelmointitekniikka (Java) - harjoitukset 4, 11.-15.2

  1. Kirjoita ohjelma joka luo ja käynnistää pyydetyn määrän säikeitä, joista kukin vain tulostaa omalla järjestysnumerollaan varustetun ilmoituksen alkamisestaan ja päättymisestään. Näiden ilmoitusten välissä kukin säie nukkuu jonkin kaikille yhyeisen vakioajan, esimerkiksi 10 millisekuntia. Kokeile ohjelmalla, käynnistyvätkö ja päättyvätkö säikeet aina numerojärjestyksessään? Jos eivät, yritä selittää miksi eivät. Kokeile myös prioriteetiltaan erilaisia säikeitä. Muuttuuko tilanne?

  2. Selvitä seuraavat Java-säikeisiin liittyvät kysymykset:
    1. Anna ainakin kolme esimerkkiä ohjelmointitilanteista, joissa säikeiden käyttö parantaa ohjelman laatua. Keksitkö tilanteita, joissa säikeiden käytöstä ei ole hyötyä tai siitä on suorastaan haittaa?
    2. Millä erilaisilla tavoilla säikeen voi luoda? Miksi yleensäkään tarvitaan rajapintaluokkaa Runnable? Miksei pelkkä Thread-luokka riitä?
    3. Mikä ero on keskeyttävällä ja vapaaehtoisella (preemptive, nonpreemptive) säikeiden skeduloinnilla? Kumpaa Java käyttää? Miten ja mihin säikeen prioriteettia käytetään? Keskeyttääko runnable-tilassa oleva korkeamman prioriteetin säie aina heikommalla prioriteetilla suoritettavan säikeen?
    4. Mitä tarkoittaa säikeen keskeyttäminen (interrupt)? Miksi säie voidaan haluta keskeyttää? Onko tilanteita, joissa säiettä on vaikeaa tai mahdotonta keskeyttää?
    5. Miksi varhaisten Java-versioden stop-, suspend- ja resume-metodien käyttöä säikeiden keskinäisessä ohjailussa pidetään turvattomana ja siksi huonona ohjelmointityylinä?

  3. Kirjoita ohjelma, joka yhdessä säikeessä tulostaa kyseisen säikeen käynnistämisestä kuluneen ajan kerran sekunnissa, toinen säie tulostaa jonkin ilmoituksen kerran viidessä sekunnissa. Pääohjelma luo ja käynnistää mainitut kaksi säiettä. Sopivan ajan kuluttua pääohjelma lopettaa käynnistämänsä säikeet.

  4. Selvitä seuraavat Java-rinnakkaisohjelmointiin liittyvät kysymykset:
    1. Laadi ohjelma, joka tulostaa pääohjelmaa suorittavan säikeen nimen.
    2. Miksi jokin säie koskaan haluaisi kutsua metodia yield? Voiko sillä antaa vuoron alemman prioriteetin säikeelle?
    3. Mikä ja millainen on daemon-säie (so. "demoni")? Anna joitankin käyttöesimerkkejä.
    4. Mikä on lukkiuma (deadlock)? Voiko sellainen tapahtua Java-ohjelmassa? Jos voi, anna esimerkki.
    5. Mikä on säieryhmä (thread group)?