Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti



Samankaltaiset tiedostot
Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Monitorit -projekti Rinnakkaisohjelmointi

Rinnakkaisohjelmointi, Syksy 2006

Liite 1. Projektin tulokset (Semaforit Javassa) Jukka Hyvärinen Aleksanteri Aaltonen

Rajapinta (interface)

Metodien tekeminen Javalla

Javan semaforit. Joel Rybicki, Aleksi Nur mi, Jara Uitto. Helsingin yliopisto

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Luento 6. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

Ohjelmointityö 65 Tekstinmuotoilu ohjelma. Dokumentaatio. Aki Heikkinen (155394)

Ohjelmointi 2 / 2010 Välikoe / 26.3

HOJ Säikeet (Java) Ville Leppänen. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.1/55

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Listarakenne (ArrayList-luokka)

T Henkilökohtainen harjoitus: FASTAXON

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

Ohjelmointityö 3. Mikko Laamanen

8. Näppäimistöltä lukeminen 8.1

Mikä yhteyssuhde on?

14. Poikkeukset 14.1

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Poikkeustenkäsittely

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Olio-ohjelmointi Javalla

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Luokan sisällä on lista

JAVA-OHJELMOINTI 3 op A274615

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

8. Näppäimistöltä lukeminen 8.1

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Periytyminen (inheritance)

4. Luokan testaus ja käyttö olion kautta 4.1

Taulukoiden käsittely Javalla

Sisältö. 22. Taulukot. Yleistä. Yleistä

1 Tehtävän kuvaus ja analysointi

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

public static void main (String [] args)

Ohjelmointi 2, välikoe

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Sisältö. 2. Taulukot. Yleistä. Yleistä

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

9. Periytyminen Javassa 9.1

Jaana Diakite Projekti 1 JAVA-Monitorit 1(13) Rinnakkaisohjelmointi Anu Uusitalo

Semaforit Javassa. Mari Kononow, Eveliina Mattila, Sindi Poikolainen HELSINGIN YLIOPISTO

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Ohjelmoinnin jatkokurssi, kurssikoe

Java-kielen perusteet

RINNAKKAINEN OHJELMOINTI A,

1. Mitä tehdään ensiksi?

9. Periytyminen Javassa 9.1

Java ja grafiikka. Ville Sundberg

10 Lock Lock-lause

20. Javan omat luokat 20.1

12. Näppäimistöltä lukeminen 12.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Olio-ohjelmointi Käyttöliittymä

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Ohjelmointi 2 / 2011 Välikoe / 25.3

Metodien tekeminen Javalla

Mitä poikkeuskäsittely tarkoittaa?

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Java-API, rajapinnat, poikkeukset, UML,...

Tietokannat II -kurssin harjoitustyö

17. Javan omat luokat 17.1

1. Omat operaatiot 1.1

812315A Ohjelmiston rakentaminen. Asynkronisuus

Java kahdessa tunnissa. Jyry Suvilehto

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

Luokat ja oliot. Ville Sundberg

YHTEYSSUHDE (assosiation)

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

11. Javan toistorakenteet 11.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Javan GUI Scratchaajalle

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Olio-ohjelmointi Virhetilanteiden käsittely

11. Javan valintarakenteet 11.1

Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Ta

Java-kielen perusteita

Ohjelmoinnin perusteet, kurssikoe

Verkko-ohjemointia. TCP vs. UDP Socket, ServerSocket Datagrammit RMI

7. Oliot ja viitteet 7.1

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

12. Javan toistorakenteet 12.1

Tietorakenteet, laskuharjoitus 7,

Transkriptio:

Rinnakkaisohjelmointi kurssi Opintopiiri työskentelyn raportti Opintopiiri: Heikki Karimo, Jesse Paakkari ja Keijo Karhu Päiväys: 15.12.2006

Ohjelmointitehtävä C i C i : Säikeet ja kriittisen vaiheen kontrollointi niiden käytön yhteydessä a. Menetelmän käyttötarkoitus ja sovellusalue Java ohjelmointikieli tukee samanaikaisuutta säikeiden avulla. Javassa on määritelty luokka Tread ja rajapinta Runnable, joiden avulla samanaikaisuuden voi toteuttaa. Säikeiden käyttötarkoitus on suorittaa samanaikaisesti useita tehtäviä ohjelmassa. Sovellusalueena on esimerkiksi verkkoyhteyden toteutus omassa säikeessään, jotta käyttöliittymä olisi käytettävissä samaan aikaan. Kriittisen vaiheen kontollointiin Java tarjoaa synchronized tarkenteen. Sitä voidaan soveltaa monipuolisesti mihin tahansa olioon, käskysarjaan tai metodiin. b. Menetelmän perusidea Luodaan luokka, joka joko perii luokan Thread tai toteuttaa rajapinnan Runnable. Luokassa on run()-metodi, jossa on koodi joka halutaan ajaa. Säie käynnistetään luokan start()-metodilla. Kriittinen vaihe kontrolloidaan synchronized tarkenteen avulla. c. Menetelmän yhteneväisyydet/eroavaisuudet kurssilla esitettyyn perustapaukseen verrattuna On yhteneväinen kurssilla esitettyyn. Ratkaisu alkoi muistuttaa monitori-käsitettä ja sitä, miten se toteutetaan Javassa. Jos ohjelmointikieli itsessään tarjoaa ratkaisun kriittisen alueen kontrollointiin, kannattaa sitä käyttää selkeyden vuoksi. d. Käyttöesimerkit Tuottaja-kuluttaja esimerkki ProconTest.java Laskuri esimerkki yhteisen muuttujan päivittämisestä Laskuri.java Käyttöesimerkit on dokumentoitu lähdekoodissa. e. Käyttöohje Kopioi ProconTest.java tiedosto oman koneesi levylle. Tarkista/aseta polkumuuttuja kuntoon, jotta voit kääntää ja ajaa komentoriviltä ohjelman. Käännä ohjelma käskyllä >javac ProconTest.java Aja käännetty ohjelma käskyllä >java ProconTest Ohjelma neuvoo käytön eteenpäin. Sama ohje käy myös Laskuri.java:lle.

Ohjelmointitehtävän listaus Käyttöesimerkki: Tuottaja-kuluttaja import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; public class ProconTest private static Producer p; private static Consumer c; private int value; private static final int MAX = 10; private int[] buff = new int[max]; private boolean hasvalue = true; private int kpl = 0; private static boolean sync = true; / @param args / public static void main(string[] args) throws IOException BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input; System.out.println("Haluatko ajaa synkronoituna/ei-synkronoituna/lopettaa [s/e/l]"); do input = br.readline(); if (input.equalsignorecase("s")) System.out.println("Ajamme synkronoituna..."); sync = true; ProconTest pc = new ProconTest(); p = pc.new Producer(); c = pc.new Consumer(); p.start(); c.start(); if (input.equalsignorecase("e")) System.out.println("Ajamme ei-synkronoituna..."); sync = false; ProconTest pc = new ProconTest(); p = pc.new Producer(); c = pc.new Consumer(); p.start(); c.start(); if (input.equalsignorecase("l")) System.out.println("Lopetit ajamisen"); continue; System.out.println("Virheellinen syöte!"); System.out.println("Haluatko ajaa synkronoituna/ei-synkronoituna/lopettaa [s/e/l]"); while (!input.equalsignorecase("l")); public void setunsyncvalue(int value) if (kpl < MAX) buff[kpl] = value; kpl++;

public int getunsyncvalue() int temp = buff[0]; if (kpl > 0) for (int i = 1; i < MAX; i++) buff[i - 1] = buff[i]; kpl--; return temp; // Kriittisen alueen kontrollointi // Varmistetaan, ettei yhteistä muistia pääse käsittelemään samaan aikaan // eri säikeet. public synchronized void setvalue(int value) // Jos puskuri on täynnä, odottaa while (kpl >= MAX) try wait(); catch (InterruptedException e) System.err.println(e.toString()); buff[kpl] = value; kpl++; notifyall(); // Kriittisen alueen kontrollointi // Varmistetaan, ettei yhteistä muistia pääse käsittelemään samaan aikaan // eri säikeet. public synchronized int getvalue() // Jos puskuri on tyhjä, odottaa while (kpl == 0) try wait(); catch (InterruptedException e) System.err.println(e.toString()); int temp = buff[0]; // Järjestetään puskuri for (int i = 1; i < MAX; i++) buff[i - 1] = buff[i]; kpl--; notifyall(); return temp; public boolean hasvalue() return hasvalue; public void sethasvalue(boolean hasvalue) this.hasvalue = hasvalue;

/ -------------- Inner class Producer ----------------------- Tuottaa 10 arvoa yhteiseen puskuriin epämääräiseen tahtiin. / public class Producer extends Thread public void run() for (int i = 0; i < MAX; i++) try Thread.sleep((int) (Math.random() 3000)); catch (Exception e) System.err.println(e.toString()); if (sync) setvalue(i); System.out.println("Tuottaja asetti : " + i); setunsyncvalue(i); System.out.println("Tuottaja asetti : " + i); sethasvalue(false); / -------------- Inner class Consumer ----------------------- Kuluttaa arvoja yhteisestä puskurista epämääräiseen tahtiin ja säilöö ne omaan sisäiseen puskuriinsa, josta tulostaa ne lopuksi, jotta voidaan varmistua, että kuluttaja on saanut kaikki arvot. / public class Consumer extends Thread int[] cbuff = new int[max]; int index = 0; public void run() int value; while (hasvalue() kpl > 0) try Thread.sleep((int) (Math.random() 3000)); catch (Exception e) System.err.println(e.toString()); if (sync) value = getvalue(); cbuff[index] = value; index++; System.out.println("Kuluttaja sai : " + value);

value = getunsyncvalue(); if (index < MAX) cbuff[index] = value; index++; System.out.println("Kuluttaja sai : " + value); System.out.println("Kuluttaja sai seuraavat arvot:"); for (int i = 0; i < MAX; i++) System.out.print(" " + cbuff[i]); System.out.println("\nHaluatko ajaa synkronoituna/ei-synkronoituna/lopettaa [s/e/l]");

Käyttöesimerkki: Yhteinen muuttuja, sitä käsittelevä laskuri. import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; public class Laskuri private static PPlus p; private static QPlus q; private static final long MAX = 1000000; private static long n = 0; private static boolean sync = true; public static void main(string[] args) throws IOException BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input; System.out.println("Haluatko ajaa synkronoituna/ei-synkronoituna/lopettaa [s/e/l]"); do input = br.readline(); if (input.equalsignorecase("s")) System.out.println("Ajamme synkronoituna..."); sync = true; n = 0; Laskuri l = new Laskuri(); p = l.new PPlus(); q = l.new QPlus(); p.start(); q.start(); if (input.equalsignorecase("e")) System.out.println("Ajamme ei-synkronoituna..."); sync = false; n = 0; Laskuri l = new Laskuri(); p = l.new PPlus(); q = l.new QPlus(); p.start(); q.start(); if (input.equalsignorecase("l")) System.out.println("Lopetit ajamisen"); continue; System.out.println("Virheellinen syöte!"); System.out.println("Haluatko ajaa synkronoituna/ei-synkronoituna/lopettaa [s/e/l]"); while (!input.equalsignorecase("l")); // Kriittisen alueen kontrollointi public synchronized void calc() n = n + 1; System.out.println("Calc = " + n); // Kriittistä aluetta ei kontrolloida, antaa yleensä vääriä tuloksia public void unsynccalc()

n = n + 1; System.out.println("UnsyncCalc = " + n); / -------------- Inner class PPlus ----------------------- Suorittaa säikeessä laskentapyynnön. / public class PPlus extends Thread public void run() for (int i = 0; i < MAX; i++) if (sync) calc(); unsynccalc(); / -------------- Inner class QPlus ----------------------- Suorittaa säikeessä laskentapyynnön. / public class QPlus extends Thread public void run() for (int i = 0; i < MAX; i++) if (sync) calc(); unsynccalc();