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

Semafory - cykliczne wyświetlanie sekwencji

Object Storage Arubacloud
0 głosów
183 wizyt
pytanie zadane 8 listopada 2022 w Java przez CanoNee Nowicjusz (230 p.)

Dzień Dobry,

Posiadam klasę, której zadaniem jest wyświetlanie sekwencji liter "ABC" o długości zadeklarowanej w programie. Program prezentuje się następująco:

import java.util.concurrent.Semaphore;

public class SemaphoresABC {

    private static final int COUNT = 10; 
    private static final int DELAY = 5; 
    
    private static final Semaphore a = new Semaphore(1, true);
    private static final Semaphore b = new Semaphore(0, true);
    private static final Semaphore c = new Semaphore(0, true);
    
    public static void main(String[] args) {
        new A().start(); 
        new B().start();
        new C().start();

    }

    private static final class A extends Thread { 

        @Override
        @SuppressWarnings("SleepWhileInLoop")
        public void run() {
            try {
                for (int i = 0; i < COUNT; i++) {
                    a.acquire();
                    System.out.print("A ");
                    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++) {
                    b.acquire();
                    System.out.print("B ");
                    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++) {
                    c.acquire();
                    System.out.print("C ");
                    a.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...");
        }
    }
}

Chciałbym jednak go zmodyfikować, aby dana litera się powtarzała, przykładowo aby stworzyć sekwencję "ABCA", czy "BCAAB". Jak mogę to osiągnąć? 

Pozdrawiam

komentarz 8 listopada 2022 przez Oscar Nałogowiec (29,320 p.)

W kodzie widać, jak każdy wątek czeka na sobie dedydowany semafor, natomiast po wydrukowaniu literki zwalnia semafor odpowiadający następnej literce. Jeśli dodatkowo spojrzysz na to, jak zainicjowane są semafory - tylko te odpowiadający watkowi A jest "podniesiony" masz w pełni zdefiniowaną sekwencje. Tylko wątek A może zająć swój semafor, potem przekazuje pałaczkę watkowi B a ten wątkowi C i w kółko. Jakbyś chciał zmienić sekwencję musisz to zmienić, ale sekwencje nieregularne wymagały by uwarunkowania tego, który semafor jest podnoszony na końcu pętli od numeru obiegu pętli (lokalnej zmiennej i). Wyjdzie albo skomplikowany, nieczytelny kod pełny if-ów i switch-y albo użyć jakiejś sprytnej tabelki opisującej "logikę biznesową".

Tego typy programy - używanie wątków, gdy kolejność wykonania jest ściśle zdefiniowana, jest pozbawione sensu - wątki są dobre gdy spora część kody może się wykonywać jednocześnie, a tylko małe fragmenty wymagają synchronizacji. Jeśli problemu nie daje się tak podzielić, by operacje były jednoczesne i coś to dawało to nie ma sensu stosować wątków.

1
komentarz 8 listopada 2022 przez Wiciorny Ekspert (270,170 p.)
kolega nie jest autorem.. więc stąd takie pytanie zadaje.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 234 wizyt
pytanie zadane 4 listopada 2019 w Java przez olimpiqem Nowicjusz (120 p.)
0 głosów
1 odpowiedź 2,932 wizyt
pytanie zadane 10 kwietnia 2019 w Java przez mn130496 Gaduła (3,530 p.)
0 głosów
1 odpowiedź 917 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...