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

Semafory, synchronizacja wątków/procesów

Cloud VPS
0 głosów
710 wizyt
pytanie zadane 6 grudnia 2020 w Java przez hicodyn Początkujący (420 p.)
edycja 6 grudnia 2020 przez hicodyn

Generalnie chodzi o to, żeby program wyświetlał BCBA w kółko i wyświetla tylko że na końcu powinno się wyświetlić dla każdej literki Thread B: I'm done... a wyświetla się tak tylko dla litery B czyli procesy nie są pokończone Tutaj wklejam fragment kodu z synchronizacją

private static final class A extends Thread { //thread definition

        @Override
        @SuppressWarnings("SleepWhileInLoop")
        public void run() {
            try {
                for (int i = 0; i < COUNT; i++) {
                    //use semaphores here
                    a.acquire();
                    a.acquire();
                    System.out.print("A ");
                    //use semaphores here
                    b.release();
                    Thread.sleep(DELAY);
                }
            } catch (InterruptedException ex) {
                System.out.println("Ooops...");
                Thread.currentThread().interrupt();
                throw new RuntimeException(ex);
            }
            System.out.println("\nThread A: I'm done...");
        }
    }

    private static final class B extends Thread {

        @Override
        @SuppressWarnings("SleepWhileInLoop")
        public void run() {
            try {
                for (int i = 0; i < COUNT; i++) {
                    //use semaphores here
                    b.acquire();
                    System.out.print("B ");
                    //use semaphores here
                    a.release();
                    c.release();
                    Thread.sleep(DELAY);
                }
            } catch (InterruptedException ex) {
                System.out.println("Ooops...");
                Thread.currentThread().interrupt();
                throw new RuntimeException(ex);
            }
            System.out.println("\nThread B: I'm done...");
        }
    }

    private static final class C extends Thread {

        @Override
        @SuppressWarnings("SleepWhileInLoop")
        public void run() {
            try {
                for (int i = 0; i < COUNT; i++) {
                    //use semaphores here
                    c.acquire();
                    c.acquire();
                    System.out.print("C ");
                    //use semaphores here
                    b.release();
                    Thread.sleep(DELAY);
                }
            } catch (InterruptedException ex) {
                System.out.println("Ooops...");
                Thread.currentThread().interrupt();
                throw new RuntimeException(ex);
            }
            System.out.println("\nThread C: I'm done...");
        }
    }

Wartości początkowe semaforów to s(a) = 0, s(b) = 1, s(c) = 1

A po uruchomieniu program wygląda tak:

1 odpowiedź

0 głosów
odpowiedź 6 grudnia 2020 przez tangarr Mędrzec (155,180 p.)
Zmienna COUNT jest wspólna dla wszystkich obiektów?|
Jeżeli tak, to wątki A i C czekają aż wątek B zwolni semafor. A nie zrobi tego bo zakończył pracę.
komentarz 6 grudnia 2020 przez hicodyn Początkujący (420 p.)
Tak, jest wspólna i równa 10, ale nie za bardzo wiem, co zrobić, żeby pozostałe wątki też zakończyły pracę
komentarz 6 grudnia 2020 przez tangarr Mędrzec (155,180 p.)
Wszystkie wątki chcą wypisać 10 komunikatów.
Wątek B ma za zadanie wypisać dwa razy więcej komunikatów niż wątki A i C.
Popraw pętlę w wątku B tak aby wyświetlała 2*COUNT komunikatów.

Podobne pytania

0 głosów
0 odpowiedzi 329 wizyt
pytanie zadane 23 stycznia 2020 w Java przez jerazmus Nowicjusz (120 p.)
+1 głos
0 odpowiedzi 165 wizyt
pytanie zadane 26 marca 2019 w Java przez matiibal Użytkownik (620 p.)
0 głosów
1 odpowiedź 353 wizyt
pytanie zadane 12 stycznia 2018 w C i C++ przez Łukasz Michalski Użytkownik (560 p.)

93,488 zapytań

142,422 odpowiedzi

322,773 komentarzy

62,907 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

Kursy INF.02 i INF.03
...