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

Java semafory - pomoc

0 głosów
238 wizyt
pytanie zadane 10 kwietnia w Java przez mn130496 Gaduła (3,080 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 przez Arkadiusz Fajdek Dyskutant (8,510 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 przez mbabane Maniak (70,020 p.)
wybrane 15 kwietnia 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 przez mn130496 Gaduła (3,080 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 przez mbabane Maniak (70,020 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 przez mn130496 Gaduła (3,080 p.)
Rozumiem dziękuję za pomoc

Podobne pytania

0 głosów
1 odpowiedź 313 wizyt
0 głosów
0 odpowiedzi 74 wizyt
pytanie zadane 13 kwietnia w C i C++ przez hidden55 Nowicjusz (210 p.)
0 głosów
1 odpowiedź 91 wizyt
pytanie zadane 28 stycznia w Algorytmy przez kartofelus Nowicjusz (120 p.)
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

65,755 zapytań

112,393 odpowiedzi

237,318 komentarzy

46,700 pasjonatów

Przeglądających: 125
Pasjonatów: 1 Gości: 124

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...