Salta el contingut
 

Examen 1a avaluació

Joan Puigcerver Ibáñez

j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Entrega

Perill

Si l'entrega no compleix aquests criteris, no és qualificarà.

  • Tots els exercicis han d'estar situats en el package corresponent: exam1
  • El nom de la classe on comença l'execució (main()) de cada exercici ha de ser el títol de l'exercici.
  • S'ha d'entregar a Aules un fitxer .zip amb el contingut del package exam1.
    • Renombrar el .zip perquè incloga el vostre nom i cognoms.
  • El format de la eixida del programa ha de ser consistent amb el format demanat.
  • El codi ha d'estar pujat a GitHub en el vostre repositori de l'assignatura en el package corresponent.
  • Crea una etiqueta a GitHub: Exam1.
    • Pots crear-ho mitjançant una Release.
  • El codi ha de poder-se compliar.

Exercici 1: TwoEditorsProcess

  • Package: exam1.twoeditors

Crea el programa TwoEditorsProcess que execute dos instàncies del editor de text del sistema, pels fitxers:

  • files/exam1/text1.txt
  • files/exam1/text2.txt

El usuari pot escriure el text que vulga en els dos editors.

Una vegada els dos editors s'han tancat, el programa crearà un altre procés que concatene el contingut dels dos fitxers i els mostre per pantalla.

Cal mostrar un missatge (com mostra l'exemple), quan l'edició dels fitxers i la concatenació haja acabat.

  • L'editor de text és: notepad.

  • Per concatenar fitxers, podeu utilitzar els segúents programes:

    • Powershell:
      Get-Content file1,file2
      
    • Linux o WSL:
      cat file1 file2
      

Output

L'edició de text ha acabat.
S'han concatenat els dos fitxers.
Contingut dels fitxers:
    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    Phasellus nec porttitor sem.
    Etiam sit amet risus luctus diam semper finibus ut nec mauris.
    Etiam a pulvinar tellus, non scelerisque ante.
    Sed egestas quam mollis nibh ornare semper mollis vel ex.
    Etiam congue finibus dui, ut mattis nibh vulputate et.
    Donec congue mauris ut nulla condimentum pellentesque.
    Cras sollicitudin congue porta. Nunc eu scelerisque sem.

Exercici 2: BuyConcertTickets

  • Package: exam1.concert

Crea el programa BuyConcertTickets, que simula una web on comprar entrades electròniques per concerts de música.

Aquesta plataforma ha decidit implementar una cua d'espera per no saturar la plataforma de pagament. La cua d'espera accepta 2 usuaris simultàniament.

L'aplicació crearà 20 persones que volen comprar entrades d'un concert que sols té aforament 10 persones.

Cal implementar:

  • Crear els fils de cada comprador.
  • Esperar que cada comprador acabe de comprar l'entrada per tancar l'aplicació.
  • Mecansisme de sincronització per gestionar la cua.
  • Mecansisme de sincronització evitar inconsistència de dades en la venta d'entrades (que es venguen exactament les 10 entrades, ni una més, ni una menys).

Codi font

BuyConcertTickets.java
package exam1.concert;

import java.util.ArrayList;
import java.util.List;

public class BuyConcertTickets {
    public static void main(String[] args) {
        String[] names = {
                "Andrès", "Àngel", "Anna", "Carles", "Enric",
                "Helena", "Isabel", "Joan", "Lorena", "Mar",
                "Maria", "Marta", "Míriam", "Nicolàs", "Òscar",
                "Paula", "Pere", "Teresa", "Toni", "Vicent"
        };
        TicketWebsite website = new TicketWebsite(10);
        List<BuyerThread> buyers = new ArrayList<>();
        for (String name : names){
            buyers.add(new BuyerThread(name, website));
        }
    }
}
TicketWebsite.java
package exam1.concert;

public class TicketWebsite {
    private int totalTickets;
    private int ticketsLeft;

    public TicketWebsite(int totalTickets) {
        this.totalTickets = totalTickets;
        this.ticketsLeft = totalTickets;
    }

    public int getNextTicket(){
        int nextTicket = ticketsLeft;
        ticketsLeft--;
        return nextTicket;
    }
    public int buyTicket() throws InterruptedException {
        System.out.printf("%s està a la cua.\n", Thread.currentThread().getName());
        System.out.printf("%s està comprant l'entrada.\n", Thread.currentThread().getName());
        Thread.sleep(2500);
        int ticket = getNextTicket();
        System.out.printf("%s ha acabat la compra.\n", Thread.currentThread().getName());
        System.out.printf("%s ha eixit de la cua.\n", Thread.currentThread().getName());
        return ticket;
    }
}
BuyerThread.java
package exam1.concert;

public class BuyerThread extends Thread {
    private TicketWebsite website;

    public BuyerThread(String name, TicketWebsite website) {
        super(name);
        this.website = website;
    }

    @Override
    public void run() {
        try {
            int ticket = website.buyTicket();
            if(ticket > 0)
                System.out.printf("%s ha comprat l'entrada número %d.\n", getName(), ticket);
            else
                System.out.printf("%s s'ha quedat sense entrada.\n", getName());
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

Exercici 3: SushiRestaurant

  • Package: exam1.sushi

Crea el programa Sushi simula un restaurant de sushi, que té dos cambrers.

El restaurant produeix 1 peça de sushi cada segon, i pot tindre emmagatzemat 10 peces de sushi.

Cada cambrer vol agafar plats de sushi. Cada plat conté 5 peces de sushi.

Cal implementar:

  • Detindre l'execució del restaurant quan els dos cambrers hagen obtingut els plats requerits.
  • Crear els mecanismes de sincronització per que els cambrers esperen a que hi haja prou peces de sushi per poder agafar un plat.
  • Que el restaurant informe que ha produït una peça de sushi i té prou peces per formar un plat.

Codi font

Sushi.java
package exam1.sushi;

public class Sushi {
    public static void main(String[] args) {
        SushiRestaurant restaurant = new SushiRestaurant(10);
        Waiter w1 = new Waiter(5, restaurant);
        Waiter w2 = new Waiter(7, restaurant);

        restaurant.start();
        w1.start();
        w2.start();
    }
}
SushiRestaurant.java
package exam1.sushi;

public class SushiRestaurant extends Thread {
    private int maxSushiPieces;
    private int currentSushiPieces;

    public SushiRestaurant(int maxSushiPieces) {
        super();
        this.maxSushiPieces = maxSushiPieces;
        this.currentSushiPieces = 0;
    }

    public void makeSushiPiece(){
        if(currentSushiPieces < maxSushiPieces)
            currentSushiPieces++;
    }

    public void retrieveShushiDish(){
        currentSushiPieces -= 5;
    }

    @Override
    public void run() {
        try {
            while (true){
                Thread.sleep(1000);
                makeSushiPiece();
                System.out.printf("Sushi restaurant (%d/%d)\n", currentSushiPieces, maxSushiPieces);
            }
        } catch (InterruptedException e) {
            System.out.println("Restaurant tancat.");
        }
    }
}
Waiter.java
package exam1.sushi;

public class Waiter extends Thread {
    private SushiRestaurant restaurant;
    private int dishes;
    private int currentDishes;

    public Waiter(int dishes, SushiRestaurant restaurant) {
        super();
        this.restaurant = restaurant;
        this.dishes = dishes;
        this.currentDishes = 0;
    }

    @Override
    public void run() {
        while(currentDishes < dishes){
            restaurant.retrieveShushiDish();
            currentDishes++;
            System.out.printf("Waiter has retrieved dish. (%d/%d)\n", currentDishes, dishes);
        }
    }
}
📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.