• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java semafory - pomoc

Object Storage Arubacloud
0 głosów
2,901 wizyt
pytanie zadane 10 kwietnia 2019 w Java przez mn130496 Gaduła (3,530 p.)

Witam 

Jestem studentem informatyki i ostatnio na zajęciach z Javy dostałem takie zadanie:

Napisz program składający się z wątków : Dane, Delta, Pierwiastki, oraz klasy Main, liczący pierwiastki równania kwadratowego, bez używania mechanizmów synchronizacji. Dane - wprowadzanie danych z klawiatury, Delta - obliczenie delty, Pierwiastki - obliczenie pierwiastków równania kwadratowego, Main - uruchomienie wątków i wyświetlenie wyników. Sprawdź wyniki obliczeń  czy są one poprawne? Zsynchronizuj pracę wątków z wykorzystaniem semaforów.Napisałem taki program

package lista5_zadania;
import java.util.Scanner;
public class Dane extends Thread{
    public int a, b, c;
    Scanner o = new Scanner(System.in);
    @Override
    public void run() {
        System.out.println("Podaj a");
        a = o.nextInt();
        System.out.println("Podaj b");
        b = o.nextInt();
        System.out.println("Podaj c");
        c = o.nextInt();
        System.out.println("Parametr a wynosi: " +a+ "\n parametr b wynosi:" +b+ "\n parametr c wynosi: " +c);

    }

    public int getA() {
        return a;
    }

    public int getB() {
        return b;
    }

    public int getC() {
        return c;
    }
}

package lista5_zadania;

public class Delta extends Thread {
    Dane d;

    public Delta(Dane d) {
        this.d = d;
    }

    double delta;
    @Override
    public void run(){
        int a = d.getA();
        int b = d.getB();
        int c = d.getC();
        delta = (b*b) - 4 * a * c;
    }
    public double getDelta() {
        return delta;
    }
}
package lista5_zadania;
public class Pierwiastki extends Thread{
    Delta p1;
    Dane p2;

    public Pierwiastki(Delta p1, Dane p2) {
        this.p1 = p1;
        this.p2 = p2;
    }



    double x0, x1, x2, pier;

    @Override
    public void run(){
        int a = p2.getA();
        int b = p2.getB();
        int c = p2.getC();
        double delta  = p1.getDelta();
        pier = Math.sqrt(delta);
        if(delta > 0 ) {
            x1 = (-b - pier) / (2 * a);
            x2 = (-b + pier) / (2 * a);
            System.out.println("Pierwiastki równania kwadratowego to: \n x1: " +x1+ " x2: " +x2);
        } else if (delta == 0) {
            x0 = (-b) / (2 * a);
            System.out.println("Pierwiastkiem równania kwadratowego jest: \n x0: " +x0);
        }

    }
}
package lista5_zadania;

public class Main {
    public static void main(String[] args) {
        Dane t1 = new  Dane();
        Delta t2 = new Delta(t1);
        Pierwiastki t3 = new Pierwiastki(t2,t1);
       t1.start();
       t2.start();
       t3.start();
    }
}

Problem polega , że nie mogę zrozumieć jak użyć tych semaforów.Czy ktoś może mi to wytłumaczyć najlepiej na przykładzie?. Z góry dziękuję

pozdrawiam  

komentarz 11 kwietnia 2019 przez Arkadiusz Fajdek Dyskutant (9,450 p.)

Kurcze, temat jest dość złożony, ogólnie ciężko tak na forum w poście wytłumaczyć. Najlepiej jak znajdziesz jakieś przykłady w sieci. Tutaj koleszka nawet spoko tłumaczy w prosty sposób o co z tym chodzi: https://www.mkyong.com/java/java-thread-mutex-and-semaphore-example/

1 odpowiedź

+1 głos
odpowiedź 14 kwietnia 2019 przez mbabane Szeryf (79,280 p.)
wybrane 15 kwietnia 2019 przez mn130496
 
Najlepsza
Czym są semafory musisz doczytać sam. W tym zadaniu wydaje mi się, że najprościej będzie użyć dwóch semaforów. Jeden do komunikacji Dane i Delta w ten sposób, że wątek Delta zaczyna się od żądania dostępu od semafora z wartością 0 (metoda Semaphore.acquire()) a wątek Dane po wykonaniu zwalnia go (Semaphore.realese(), czyli zwiększenie licznika o 1).

Drugi semafor będzie współdzielony przez wątek Delta i Pierwiastek dokładnie w analogiczny sposób. Wątek Pierwiastek zaczyna od żądania dostępu (Semaphore.acquire()), a wątek Delta po skończeniu obliczeń zwalnia semafor (Semaphore.realese()).

W obu przypadkach semafory trzeba inicjalizować wartością zero (new Semaphore(0)). Dlaczego doczytaj/zbadaj sam.
komentarz 15 kwietnia 2019 przez mn130496 Gaduła (3,530 p.)

Dziękuję za pomoc. Napisałem coś takiego 

package lista5_zadania;
import java.util.Scanner;
import java.util.concurrent.Semaphore;

public class Dane extends Thread{
    public int a, b, c;
    Semaphore s = new Semaphore(0);
    Scanner o = new Scanner(System.in);
    @Override
    public void run() {
        System.out.println("Podaj a");
        a = o.nextInt();
        System.out.println("Podaj b");
        b = o.nextInt();
        System.out.println("Podaj c");
        c = o.nextInt();
        System.out.println("Parametr a wynosi: " +a+ "\n parametr b wynosi:" +b+ "\n parametr c wynosi: " +c);
        s.release();

    }

    public int getA() {
        return a;
    }

    public int getB() {
        return b;
    }

    public int getC() {
        return c;
    }
}
package lista5_zadania;
import java.util.concurrent.Semaphore;
public class Delta extends Thread {
    Dane d;
    Semaphore s = new Semaphore(0);

    public Delta(Dane d) {
        this.d = d;
    }

    double delta;
    @Override
    public void run(){
        try {
            s.acquire();
            int a = d.getA();
            int b = d.getB();
            int c = d.getC();
            delta = (b*b) - 4 * a * c;
            System.out.println("delta wynosi: " +delta );
            s.release();
        } catch (InterruptedException e) {
            System.out.println("Wystąpił jakiś błąd");
        }
    }
    public double getDelta() {
        return delta;
    }
}
package lista5_zadania;
import java.util.concurrent.Semaphore;
public class Pierwiastki extends Thread{
    Semaphore s = new Semaphore(0);
    Delta p1;
    Dane p2;

    public Pierwiastki(Delta p1, Dane p2) {
        this.p1 = p1;
        this.p2 = p2;
    }



    double x0, x1, x2, pier;

    @Override
    public void run(){
        try {
            s.acquire();
            int a = p2.getA();
            int b = p2.getB();
            int c = p2.getC();
            double delta  = p1.getDelta();
            pier = Math.sqrt(delta);
            if(delta > 0 ) {
                System.out.println("Pierwiastek z delty wynosi: " +pier);
                x1 = (-b - pier) / (2 * a);
                x2 = (-b + pier) / (2 * a);
                System.out.println("Pierwiastki równania kwadratowego to: \n x1: " +x1+ " x2: " +x2);
            } else if (delta == 0) {
                x0 = (-b) / (2 * a);
                System.out.println("Pierwiastkiem równania kwadratowego jest: \n x0: " +x0);
            } else{
                System.out.println("Brak rozwiązania w zbiorze liczb rzeczywistych");
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
package lista5_zadania;
import java.util.concurrent.Semaphore;
public class Main {
    public static void main(String[] args) {
        Dane t1 = new Dane();
        Delta t2 = new Delta(t1);
        Pierwiastki t3 = new Pierwiastki(t2, t1);
        t1.start();
        t2.start();
        t3.start();
    }
}

Tylko jest ten problem że wątek Dane zaczyna działać podaje dane te dane się wyświetlają czyli wykonuje się wszystko z metody run ale potem program się zawiesza i w kółko mogę wpisywać dane a wątki delta i pierwiastki się nie wykonują. Próbowałem znaleźć przyczynę dlaczego tak się dzieje ale nie udało mi się.Czy mógłbyś mi podpowiedzieć gdzie zrobiłem błąd?

pozdrawiam 

komentarz 15 kwietnia 2019 przez mbabane Szeryf (79,280 p.)
W Twoim kodzie każdy wątek ma swój własny semafor. A chodzi o to żeby odpowiednie wątki współdzieliły dany semafor, po to żeby mogły się wzajemnie informować o gotowości. Jeden semafor dla Dane i Delta oraz jeden dla Delta i Pierwiastki. Te semafory musisz stworzyć w main i przekazać odpowiednio do wątków, np. przez konstruktor.
komentarz 15 kwietnia 2019 przez mn130496 Gaduła (3,530 p.)
Rozumiem dziękuję za pomoc

Podobne pytania

0 głosów
0 odpowiedzi 232 wizyt
pytanie zadane 4 listopada 2019 w Java przez olimpiqem Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 179 wizyt
pytanie zadane 8 listopada 2022 w Java przez CanoNee Nowicjusz (230 p.)
0 głosów
1 odpowiedź 914 wizyt

92,539 zapytań

141,382 odpowiedzi

319,479 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...