W Javie semafor to mechanizm synchronizacji wątków, który pozwala przenosić sygnały w wątkach w celu zarządzania równoczesnymi działaniami. Zapewnia pozwolenie na dostęp do wspólnego zasobu, w wyniku czego wątek musi uzyskać zgodę od semafora w celu uzyskania dostępu do zasobów. Klasa semafora w Javie dodatkowo ma konstruktory i metody kontrolowania dostępu do wspólnego zasobu, które zostaną omówione w tym artykule.
Co to jest semafor
Jeśli licznik jest większy niż zero, wątek otrzymuje dostęp do wspólnego zasobu, a licznik jest zmniejszany o jeden, w przeciwnym razie wątek nie otrzyma pozwolenia i zostanie zawieszony. Gdy wykonanie wątku jest zakończone, zasób nie jest już wymagany, a wątek go uwalnia. Wartość licznika wzrosła o jeden po zwolnieniu zasobu. Wątek musi najpierw uzyskać pozwolenie i musi poczekać, zanim zasoby zostaną nabyte. Wątek nie będzie w stanie udostępniać żadnych zasobów, jeśli licznik osiągnie zero:
Teraz pełny kod wykonania wątków jest wspomniany poniżej:
Importuj Java.Util.równoległy.*;
Importuj Java.Util.równoległy.Semafor;
SemaforeClient klasy publicznej
public static void main (string [] args)
Semaphore sem = nowy semafor (1);
// Tworzenie dwóch wątków o nazwie T1 i T2
// Wątek T1 zwiększy liczbę
// Wątek T2 zmniejszy liczbę
Semaphorethread mt1 = NOWOŚĆ SEMAFORETHREAD (SEM, „T1”);
Semaphorethread mt2 = Nowy Semaphorethread (SEM, „T2”);
// Wątki Stat T1 i T2
MT1.początek();
MT2.początek();
próbować
// Oczekiwanie na wątki T1 i T2
MT1.dołączyć();
MT2.dołączyć();
catch (przerywanie ex)
System.błądzić.println („wyjątek:”+ ex.getMessage ());
System.na zewnątrz.println („Count:” + sharedResource.liczyć);
klasa sharedResource
static int liczba = 0;
SemaphoThread.Jawa
Klasa SemaphoThread rozszerza wątek
Semafor _sem;
Ciąg _ThreadName;
Public SemaphoThread (Semaphore SEM, String Thname)
super (thname);
Ten._Sem = sem;
Ten._ThreadName = thname;
@Nadpisanie
Public void Run ()
Jeśli to.getName ().równa się („T1”))
System.na zewnątrz.println („uruchomienie” + to._ThreadName);
próbować
System.na zewnątrz.println (to._ThreadName + "czeka na pozwolenie.");
// pozyskiwanie zamka
Ten._Sem.nabywać();
System.na zewnątrz.println (to._ThreadName + „otrzymuje pozwolenie.");
dla (int i = 0; i < 5; i++)
SharedResource.count ++;
System.na zewnątrz.println (_threadName + ":" + sharedResource.liczyć);
Nitka.sen (20);
Catch (przerywanie excception)
System.na zewnątrz.println (exc.getMessage ());
// Zwolnij zezwolenie.
System.na zewnątrz.println (_ThreadName + „uwalnia zezwolenie.");
Ten._Sem.uwolnienie();
else //// prowadzony przez wątek T2
System.na zewnątrz.println („uruchamianie” + _ThreadName);
próbować
// Po pierwsze, uzyskaj pozwolenie.
System.na zewnątrz.println (to._ThreadName + "czeka na pozwolenie.");
Ten._Sem.nabywać();
System.na zewnątrz.println (_threadName + "otrzymuje pozwolenie.");
dla (int i = 0; i < 5; i++)
SharedResource.liczyć--;
System.na zewnątrz.println (_ThreadName
+ „:” + SharedResource.liczyć);
Nitka.sen (20);
Catch (przerywanie excception)
System.na zewnątrz.println (exc.getMessage ());
// Zwolnij zezwolenie.
System.na zewnątrz.println (_ThreadName + „uwalnia zezwolenie.");
_Sem.uwolnienie();
//uruchomić()
//klasa
Teraz w powyższym kodzie zdefiniowaliśmy trzy różne klasy, które są „SemphoreClient”, „SharedResource”, I „SemaphoThread”. W semaforeClient zainicjowaliśmy dwa wątki za pomocą jednej zgody. Wątek T1 zwiększy licznik po wykonaniu, podczas gdy wątek T2 go zmniejszy. Klasa sharedResource pochodzi z miejsca, w którym wątki będą udostępniać dostęp. W klasie SemaphoThread zainicjowaliśmy proces blokowania obu wątków T1 i. Teraz przed wykonaniem kodu musisz upewnić się, że najpierw zainstalowałeś aplikację Java Development Kit (JDK) w systemie operacyjnym Linux za pomocą poniższego polecenia w terminalu
$ sudo apt Zainstaluj default-jdk
Teraz po jego weryfikacji możesz otworzyć dowolny edytor, a następnie napisać i zapisać kod Java w nim, jak pokazano poniżej.
$ nano SemaphoreClient.Jawa
Kod, który napisaliśmy w środku „SemaforeClient.Jawa' Plik jest pokazany poniżej.
Możesz zobaczyć wyjście kodu, jak pokazano poniżej
Wyjście pokazuje, że istnieją dwa wątki; Na pierwszym obrazie wykonano wątek T1, a następnie, gdy T1 zwolni zezwolenie, wątek T2 zaczyna wykonywać; Na drugim obrazie wątek T2 został najpierw wykonany, a następnie wątek T1. Oznacza to, że jakikolwiek wątek miał okazję najpierw zablokować proces, wymagając od drugiego wątku do poczekać.
Wniosek
Semafor to obiekt Java, który służy do kontrolowania dostępu do wspólnego zasobu i jest to metoda synchronizacji wątków, która pozwala wysyłać sygnały w wątkach, aby zarządzać kilkoma zadaniami w tym samym czasie. Daje dostęp do wspólnego zasobu, w wyniku czego wątek musi najpierw uzyskać zgodę z semafora przed użyciem zasobów. W tym artykule utworzyliśmy dwa wątki A i B z jednym pozwoleniem. Tak więc każdy z tych dwóch wątków rozpocznie wykonywanie i zablokuje proces, a następnie drugi wątek musi poczekać, aż proces zostanie zwolniony.