Hajautetut ja samanaikaiset järjestelmät 28.3.2008 Harjoitus 3 Seuraavissa tehtävissä tehdään pientä reaktionopeudemittauspeliä säikeillä. Sen toki voisi tehdä suoraviivaisemmin ilman säikeitä, mutta nyt nimenomaan harjoitellaan säikeiden ohjelmointia. Kurssin www-sivulla on ohjelmien runko, StopWatch -apuluokka ja tehtävän 16 esimerkkiratkaisu (.jar). Seuraava X2 tehtävä on pakollinen kaikille opiskelijoille. X-tehtävien ratkaisujen pitää olla kunkin opiskelijan itse tekemiä. Saman ratkaisun kopioita ei hyväksytä (versioitunakaan). Vastaukset pitää lähettää edeltävänä päivänä (to) klo 14.00 mennessä sähköpostitse allaolevaa ohjetta käyttäen. Saat automaattisen vastauksen pian onnistuneen lähetyksen jälkeen. Vastauksen on sisällettävä (ohjelman kommenttina) lyhyt itsearviointi jossa arvioit ratkaisun toimivuutta, luotettavuutta ja mahdollisia parannusmahdollisuuksia. Oikea itsearvointi (jonkinlaiseen ratkaisuun) on yhden pisteen arvoinen. Lähetä ratkaisusi cs:n käyttäjälle sjuva käyttäen viestin otsikkona merkkijonoa HS_X2_tunnus missä tunnus on sinun cs-käyttäjätunnuksesi (tai tunnus@cc). Helpointa lähettäminen on cs:ltä käyttäen komentoa: /usr/ucb/mail -s HS_X2_tunnus sjuva < tunnus.java missä tunnus on cs-käyttäjätunnuksesi ja tunnus.java on ohjelmatiedosto joka sisältää vastauksesi. Jotta tehtävä kääntyisi, on pääohjelman luokan nimen oltava täsmälleen sama kuin käyttäjätunnuksesi (kuitenkin ilman @cc tms. osuutta). StopWatch -apuluokkaa ei tarvitse sisällyttää mukaan. Huomaa myös, ettei Java-kääntäjälle kelpaa HTML, MIME, allekirjoitukset, eikä merkkijonojen/kommenttien jakaminen usealle riville. X2) Kirjoita luokka (säie) DelayThread joka saa konstruktorissa parametrinaan nimen (merkkijono) ja aikaviiveen. Käynnistyttyään, säie nukkuun aikaviiveen verran, tulostaa nimensä ja käynnistää kellon (StopWatch). Luokalla on myös metodi time() joka palauttaa tulostamisesta kuluneen ajan tai "ei käynnistetty" jos tulostusta ei ole vielä tehty. Toteuta myös metodi cancel() joka pysäyttää odottamisen ja peruuttaa tulostamisen. Kirjoita yo. luokkaa käyttäen peli jolla mitataan käyttäjän reaktioaikaa. Ohjelma tulostaa "valmiina", "paikoillaan", ja käynnistää DelayThread -säikeen nimellä "Paina ENTER" ja satunnaisella viiveellä. Tämän jälkeen jäädään odottamaan käyttäjän ENTER-painallusta. Kun käyttäjä on painanut ENTER, tulostetaan taustasäikeen aika (time()) ja aloitetaan alusta. 16) Lisää edellisen tehtävän ohjelmaan hämäystulostus. Varsinaisen reaktiota mittaavan säikeen lisäksi perustetaan toinen säie nimiellä "Älä paina" ja samaa luokkaa olevalla satunnaisella viiveellä. Jos hämäystulostus tulee ensin ja käyttäjä nyt painaa, varsinaisen aikamittaussäikeen aikaa ei ole vielä käynnistetty. Jos varsinainen tulostus tulee ensin, hämäystulostusta ei annetua ollenkaan. Jos käyttäjä painaa ENTER liian aikaisin, molemmat säikeet lopetetaan (tulostus estetään). 17) Lisää edelliseen tehtävään 16 rajoitus joka asettaa hämäyksen ja varsinaisen tulostuksen väliksi vähintään 0,5 s. Toteuta tämä lukituksella näiden kahden säikeen välillä (ts. hämäys-säie ottaa lukon haltuun ja estää näin oikeaa säiettä tulostamasta). 18) Muutetaan edelleen tehtävän 16 toimintaa siten, että jos hämäystulostus tulee ensin, hämäyssäie keskeyttää oikean tulostuksen säikeen ja pyytää sitä aloittamaan viive alusta. Edelleen, hämäyssäie aloittaa omankin viiveensä alusta.