Opgaver i parallelle processer ved hjælp af trådning.

27. august 2001

1. Timeren

Lav en klasse, der skal kunne afvikles som en tråd. En instans af klassen skal kunne fungere som et aktivt objekt, der hvert sekund opdaterer en tæller.

Tælleren registrerer altså, hvor mange sekunder der er gået, siden tråden startede.

Udover run() metoden forsynes klassen med en metode, reset(), som kan nulstille tælleren, og en metode, getSeconds(), som kan returnere tællerens aktuelle værdi.

Lav også et lille program med en simpel GUI, som kan bruges til test af trådklassen. Hver gang man trykker på en "Test" knap, hentes tællerens værdi, som udskrives.

 

 

2. Posthuset

Ved hver indgang til et posthus har man opstillet et apparat, hvor kunderne kan trække et nummer, hvis de ønsker at blive ekspederet ved en af skrankerne. Når en medarbejder ved en af skrankerne er klar til at ekspedere en ny kunde, trykkes på en knap og nummeret på den næste kunde vises på en lystavle ved skranken. Følgende skærmbillede simulerer posthusets opbygning.

 

 

  1. Opgaven løses med tråde: en hoved tråd (main thread), en tråd for udlevering af numre (Knap) og en tråd for udløsning af næste ekspedition (Skranke). Herudover laves nødvendige klasser til opbevaring af tællere (Counter). En instans af den tilsvarende tråd oprettes hver gang en event (knaptryk) indtræffer - tråden dør efter endt behandling af eventen.
  2. Udvid skærmbilledet til 2 knapper og 5 skranker.
  3. Løs opgaven med anvendelse af metoderne resume() og suspend(). Det vil sige at der laves en tråd for hver knap. Denne tråd kører i hele programmets levetid.
  4. Løs opgaven med anvendelse af metoderne wait() og notify().

 

3. Parkeringshuset

Ved indgangen til et parkeringshus vil man gerne kunne gøre bilisterne opmærksomme på, hvor mange ledige parkeringspladser, der er til rådighed. Hvis der ikke er flere ledige pladser, skal en bom samtidig forhindre, at der ikke kører biler ind, som der alligevel ikke er plads til.

Når en bil har passeret indkørslen, bliver antallet af tomme pladser talt en ned. Hvis antallet af tomme pladser herefter er 0, sænkes bommen. Når en bil passerer udkørslen bliver antallet af tomme pladser talt en op, og bommen hæves, hvis den har været sænket.

Opgaven er at lave et program, der kan simulere den beskrevne situation. Programmet skal udformes ved hjælp af tråde. Skærmbilledet kan udformes efter nedenstående forbillede:

 

Tryk på Ind svarer til, at en bil passerer indkørslen. Tryk på Ud svarer til, at en bil passerer udkørslen.

 

4. Jernbaneoverskæringen

En to-sporet jernbane krydser en vej. Jernbaneoverskæringen er forsynet med bomme, som sænkes, når et tog passerer et signal, der er anbragt 4 km før jernbaneoverskæringen. Når toget har passeret jernbaneoverskæringen kan bommen hæves, med mindre der kommer et tog fra den anden side.

Opgaven er at lave et program, der kan simulere den beskrevne situation. Programmet skal udformes ved hjælp af tråde. Skærmbilledet kan udformes således:

 

 

5. Input, behandling, output

Der skal udarbejdes et program bestående af tre tråde.

Den første tråd skal indlæse et navn ved hjælp af f.eks. InputQuery. Navnet indtastes normalt med fornavn først og derefter mellem- og efternavne. Navnet tilføjes til en listbox og placeres i en inputbuffer, hvis der er plads.

Den næste tråd henter løbende navne fra inputbufferen, hvis der er nogle. Navnet ændres nu, så efternavnet kommer til at stå først, efterfulgt af fornavn og mellemnavne. Det ændrede navn placeres i en outputbuffer, hvis der er plads.

Den sidste tråd henter løbende navne fra outputbufferen, hvis der er nogle. Navnene placeres i en listbox, hvor de skal være sorteret i stigende orden.

Et skærmbillede til opgaven kan være udformet således: