Hirdetés

Új hozzászólás Aktív témák

  • smallmer

    őstag

    Sziasztok,
    múlt hét után ismét megjelenek egy kérdéssel. az alábbi a feladat:

    Hozz létre egy osztályt Bankszamla néven. Parancssori argumentumként várja a bankszámla kezdeti egyenlegét és a számla felhasználóinak számát.
    Hozz létre minden felhasználónak egy külön szálat.
    A következőt ismételd 5-ször:
    - véletlenszerűen a felhasználó vegyen ki/rakjon be egy véletlenszerűen generált összeget a számlára
    - várjon 1-3 másodpercet, majd kezdje újra

    Minden tranzakciónál írd ki a tranzakció típusát, az összeget, illetve az új egyenleget. Pl.: Kivesz, összeg: 533, uj egyenleg: 313
    A számla egyenlege soha nem lehet kevesebb, mint 0 Ft. Ha valaki többet szeretne kivenni, mint a számlaegyenleg, akkor a számlán levő teljes összeget vegye ki, de csak annyit. Ha üres számláról szeretne kivenni egy összeget, akkor továbbra is 0 marad a számlaegyenleg. Ügyelj a konkurens hozzáférésből eredő problémák kiküszöbölésére!

    Várd meg, míg az összes szál lefut, majd írd ki a képernyőre a következő üzenetet: "A program befejeződött".

    itt a kódom:

    package beadando;

    import java.io.*;
    import java.util.*;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class Szalak {

    public static void main(String[] args) throws Exception {
    int kezdeti_egyenleg = Integer.parseInt(args[0]);
    int felhasznalok_szama = Integer.parseInt(args[1]);
    //boolean kesz =false;

    for (int i=1; i<=felhasznalok_szama; i++) {
    new Beadando(kezdeti_egyenleg).start();
    }
    for (int i=1; i<=felhasznalok_szama; i++) {
    new Beadando(kezdeti_egyenleg).join();
    }

    }
    }

    class Beadando extends Thread {
    Random rand = new Random();

    private int i_kezdet;
    //private boolean kesz;

    public Beadando(int kezdeti_egyenleg) {
    this.i_kezdet = kezdeti_egyenleg;
    //this.kesz = kesz;
    }

    @Override
    public void run() {
    synchronized (Szalak.class) {
    //int x = i_kezdet;

    for(int j=1; j<=5;j++){
    int rand_berakvagykivesz = rand.nextInt(2);

    if(rand_berakvagykivesz == 0)
    {
    int rand_szam = rand.nextInt(200000);
    i_kezdet+=rand_szam;
    System.out.println("berak: " + rand_szam);
    System.out.println("Új egyenleg: "+ i_kezdet);




    }else if(rand_berakvagykivesz == 1){
    int rand_szam2 = rand.nextInt(200000);
    if(rand_szam2 > i_kezdet ){
    i_kezdet-=i_kezdet;
    }else{
    i_kezdet-=rand_szam2;
    System.out.println("kivesz: " + rand_szam2);
    System.out.println("Új egyenleg: "+ i_kezdet);
    }

    }

    try {
    Thread.sleep(1000);
    } catch (InterruptedException ex) {
    Logger.getLogger(Beadando.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

    }

    }

    }

    a hiba, hogy ha mondjuk 2 lesz a felhasználók száma, akkor ugye 10 szer kellene berakni vagy kivenni, mert mindkét esetben a for ciklus a run-ban 5ször fut le, viszont nálam van hogy 6-szor , de lehet hogy 8-szor, tehát össze-vissza. esetleg valami ötlet?

Új hozzászólás Aktív témák