LinkedIn Bufor Reddit Tumblr 7 AKCJE

Pakiet zawiera różne narzędzia współbieżności języka Java, które udostępniają różne klasy dla wielowątkowość. Ten pakiet jest obecny od wersji Java 5. Wcześniej użytkownik musi stworzyć własne narzędzia do tworzenia współbieżnych aplikacji.

W tym samouczku zobaczymy przegląd wszystkich narzędzi do współbieżności języka Java.

Narzędzia współbieżności języka Java

Pakiet zawiera poniższe klasy, których możemy użyć do implementacji współbieżności lub wielowątkowości.

szpilka

Usługa Wykonawcy

Projekt Usługa Wykonawcy to interfejs będący częścią pakietu który wykonuje asynchroniczne wykonywanie zadań. To narzędzie współbieżności języka Java wykonuje zadania jednocześnie w tle. Tworząc ExecutorService, możemy utworzyć plik pula wątków z wymaganym rozmiarem przy użyciu metody newFixedThreadPool (int size). Możemy również stworzyć pojedynczy wątek za pomocą metody newSingleThreadExecutor(ThreadFactory threadFactory). Innym sposobem jest użycie newScheduledThreadPool(int size) .

ExecutorService exec = ExecutorService exec = ExecutorService exec =

Istnieje wiele sposobów, w jakie możemy delegować zadanie do ExecutorService w celu wykonania.

execute (Runnable)

przesłać (do uruchomienia)

przesłać (wywoływane)

invokeAny ()

invokeAll ()

Po zakończeniu wykonywania bardzo ważne jest zamknięcie usługi ExecutorService przy użyciu dowolnej z poniższych metod.

zamknąć()

shutdownNow ()

awaitTermination ()

Zaplanowana Usługa Wykonawcy

To także jest ExecutorService który wykonuje zadanie po zaplanowanym przedziale czasu lub po określonym opóźnieniu. Możemy określić liczbę wątków, które chcemy utworzyć za pomocą newScheduledThreadPool . Wywołując metodę schedule, możemy określić przedział czasu, po którym zadanie ma zostać wykonane.

ScheduledExecutorService sch = ScheduledFuture sf = sch.schedule(new Callable() { -----code---- }, 5, TimeUnit.SECONDS);

Po utworzeniu instancji ScheduledExecutorService , możemy wykonać zadanie tego wykorzystania współbieżności przy użyciu dowolnej z poniższych metod.

harmonogram (zadanie wywoływalne, duże opóźnienie, jednostka czasu TimeUnit)

harmonogram (zadanie uruchamialne, duże opóźnienie, jednostka czasu TimeUnit)

scheduleAtFixedRate (Runnable, long intialDelay, long period, TimeUnit timeunit)

scheduleWithFixedDelay (Runnable, long initialDelay, long period, TimeUnit timeunit)

Podobnie jak w przypadku ExecutorService, musimy zamknąć Zaplanowana Usługa Wykonawcy albo za pomocą shutdown() metoda lub shutdownNow() Metoda.

Blokowanie kolejki

Blokowanie kolejki to interfejs będący częścią pakietu Pozwala wielu wątkom jednocześnie wstawiać i usuwać elementy z kolejki. Ma również możliwość blokowania wątków podczas wstawiania i usuwania elementów. Oznacza to, że może zablokować wątek podczas operacji usuwania, gdy w kolejce nie ma już elementów i czeka, aż będzie co najmniej 1 element. Podobnie blokuje się podczas operacji wstawiania, gdy próbujemy wstawić element, gdy kolejka osiągnęła maksymalną pojemność. W BlockingQueue jeden wątek zawsze wstawia element, podczas gdy drugi wątek usuwa element z kolejki.

Możemy użyć metod add () lub offer (), aby wstawić elementy i użyć metody remove (), take () lub poll (), aby usunąć element z BlockingQueue. Aby pobrać pierwszy element, możemy skorzystać z metody peek () lub element ().

Kolejka blokowania tablicy

Kolejka blokowania tablicy to klasa implementująca interfejs BlockingQueue. Wewnętrznie przechowuje elementy w postaci tablicy. Możemy określić górną granicę podczas tworzenia instancji obiektu i nie możemy tego później zmienić.

BlockingQueue bq = new ArrayBlockingQueue(1024);

Opóźnienie kolejki

Projekt Opóźnienie kolejki klasa implementuje interfejs BlockingQueue. Ta klasa blokuje elementy do momentu wygaśnięcia określonego opóźnienia czasowego. Aby użyć klasy DelayQueue, elementy muszą implementować interfejs

Połączona kolejka blokowania

Projekt Połączona kolejka blokowania class implementuje również interfejs BlockingQueue. Wewnętrznie przechowuje elementy w postaci struktury LinkedList i utrzymuje FIFO (FirstInFirstOut). Oznacza to, że elementy head reprezentują element, który wstawiamy jako pierwszy, a element tail reprezentuje element, który wstawiamy jako ostatni.

BlockingQueue bq = new LinkedBlockingQueue();

Kolejka blokowania priorytetów

Projekt Kolejka blokowania priorytetów klasa implementuje interfejs BlockingQueue. Funkcjonalność jest taka sama jak java.util.PriorityQueue. Wszystkie elementy muszą zaimplementować interfejs porównywalny. Opierając się na implementacji w interfejsie Comparable, odpowiednio porządkuje elementy.

BlockingQueue bq = new PriorityBlockingQueue();

Synchroniczna kolejka

Projekt Synchroniczna kolejka klasa implementuje interfejs BlockingQueue. Pozwala na wymianę tylko jednego elementu na raz. Oznacza to, że wątek musi czekać na wstawienie elementu, aż inny wątek usunie element z kolejki. Utrzymuje synchronizacja w taki sposób, że gdy wątek próbuje usunąć element, gdy kolejka jest pusta, blokuje się, dopóki nie wstawi elementu do kolejki.

Blokowanie Deque

Projekt Blokowanie Deque to interfejs będący częścią pakietu Reprezentuje deque i blokuje wstawianie lub usuwanie elementów, jeśli takie operacje nie są możliwe. Deque oznacza Podwójnie zakończona kolejka. Oznacza to, że możemy wstawiać i usuwać elementy z obu końców.

LinkedBlockingDeque

Projekt LinkedBlockingDeque klasa implementuje interfejs BlockingDeque. Reprezentuje podwójną kolejkę, która obsługuje operacje wstawiania i usuwania z obu końców.

BlockingDeque dq = new LinkedBlockingDeque();

Na żądanie i przyszłość

Interfejsy Java Callable i Future jest powszechnym pojęciem w koncepcji wielowątkowości. Możemy tego użyć głównie wtedy, gdy chcemy, aby wątki zwracały pewne wartości. Jest to część współbieżności pakiet i jest dostępny od wersji Java 5. Możemy użyć obiektu Future, aby znaleźć stan zadań wywoływanych. Zadania wywoływalne zwracają przyszły obiekt.

OdliczanieZatrzask

Projekt OdliczanieZatrzask jest częścią pakietu który blokuje grupę wątków do czasu zakończenia innej operacji. Musimy zainicjować CountDownLatch wartością licznika, która zmniejsza się za każdym razem, gdy wywołujemy metodę countDown (). Kiedy ta wartość licznika osiągnie 0, inne wątki również zostaną zwolnione.

CountDownLatch cd = new CountDownLatch(int counter);

Bariera cykliczna

Bariera cykliczna realizuje synchronizację, w której synchronizuje wątki lub działa jako bariera. Oznacza to, że wszystkie wątki muszą poczekać lub przejść przez tę barierę, zanim kontynuują swój proces. W tym celu używa rozszerzenia await() metoda na CyclicBarrier. Gdy wszystkie wątki osiągną tę barierę, może wznowić i kontynuować wykonywanie.

CyclicBarrier cb = new CyclicBarrier(int count); cb.await();

Mapa współbieżna

ConcurrentMap to interfejs będący częścią pakietu w którym reprezentuje strukturę Map. Oprócz metod obecnych w interfejsie Map ma swoje własne metody. Ponieważ jest to interfejs, musimy zaimplementować tę funkcjonalność i dlatego możemy używać ConcurrentHashMap.

ConcurrentMap cm = new ConcurrentHashMap(); cm.put("key","value");

WspółbieżnaNavigableMap

ConcurrentNavigableMap to interfejs, który jest również częścią pakietu w którym reprezentuje strukturę NaviagableMap. Obsługuje współbieżny dostęp do map podrzędnych, które otrzymujemy za pomocą funkcji headMap (), tailMap ().

ConcurrentNavigableMap cn = new ConcurrentSkipListMap();

Wymiennik

Wymiennik działa jak pojemnik, w którym dwa wątki mogą wymieniać ze sobą obiekty. Jest obecny w pakiecie Wątki mogą wymieniać obiekty za pomocą exchange() Metoda.

Exchanger ex = new Exchanger();

Wykonawca puli wątków

ThreadPoolExecutor zapewnia implementację dla ExecutorService. Wykonuje zadania wywoływalne lub uruchamialne przy użyciu wątków w puli. Pula wątków może zawierać liczbę N wątków i możemy określić jej rozmiar za pomocą corePoolSize or maximumPoolSize zmiennych.

WidelecDołącz do basenu

ForkJoinPool obecny w pakiecie pomaga podzielić zadania i umożliwia jednoczesne wykonywanie podzadań. Gdy wszystkie podzadania zakończą wykonanie, następuje scalenie i ponowne połączenie. Ten proces składa się z dwóch etapów: widelec(podziel zadanie) i przystąpić(scal podzadanie). ForkJoinPool jest dostępny od wersji Java 7.

ForkJoinPool fp = new ForkJoinPool(int count);

szpilka

Zamki

Blokada zapewnia, że ​​tylko aktualnie wykonywany wątek ma dostęp do udostępnionego zasobu i blokuje dostęp do niego innym wątkom do momentu zwolnienia zasobu przez bieżący wątek. Jest to używane głównie do synchronizacji i możemy używać jego metod, takich jak lock () i unlock () w oddzielnych metodach. Służy do zapobiegania warunkom wyścigu i krytycznym odcinkom. Aby stworzyć Lock, musimy stworzyć klasę, która definiuje interfejs Lock. Plik lock() metoda blokuje obiekt i unlock() metoda odblokowuje obiekt. Korzystanie z sekcji krytycznych jest bezpieczne zawsze po zablokowaniu zasobu.

ReentrantLocks

Ponowna blokada jest implementacją interfejsu Lock. Możemy użyć blokad ponownych, gdy chcemy, aby wątek wielokrotnie blokował ten sam zasób. Podczas korzystania z blokad reentrant wewnętrznie zwiększa wartość count, gdy wywołujemy metodę lock (), i zmniejsza wartość, gdy wywołujemy metodę unlock ().

Lock l = new ReentrantLock(); try { l.lock(); //critical section } finally{ l.unlock(); }

Blokady ponownego wprowadzania są przydatne podczas implementowania współbieżności. Blokada Reentrant ma swoje własne metody, takie jak isLocked() , getHoldCount() itp., które szczegółowo omówimy w oddzielnych samouczkach.

Blokady odczytu i zapisu

ReadWriteLocks umożliwia wielu wątkom używanie blokady do odczytu, ale umożliwia tylko jedną blokadę do zapisu. Istnieją pewne zasady implementacji ReadLock i WriteLock.

Blokada odczytu: Wiele wątków może uzyskać ReadLock, gdy żadne inne wątki nie używają WriteLock ani nie zażądały WriteLock.

WriteLock: Tylko jeden wątek może uzyskać WriteLock na raz, gdy nie ma innych wątków odczytujących ani zapisujących.

Semafor

Semafor to jedno z narzędzi współbieżności języka Java, które służy do blokowania dostępu wątku do sekcji krytycznych. Zanim wątek przejdzie do sekcji krytycznej, sprawdza, czy semafor ma zezwolenie, czy nie. Jeśli jest zezwolenie, pozwala wątkowi wejść, w przeciwnym razie nie. Zawiera metodę sprawdzania liczby dostępnych zezwoleń. Semafory mogą być również używane do sygnalizacji wątków.

Liczenie semaforów : Ten typ semafora może policzyć liczbę sygnałów wysłanych przy użyciu take() Metoda.

: Ten typ semafora może policzyć liczbę sygnałów wysłanych przy użyciu Metoda. Ograniczony semafor: Jest to semafor, który ma górną granicę liczby sygnałów, które może przechowywać

Semafor ma 2 główne metody: acquire() dzięki release() . Zawsze, gdy dzwonimy do acquire() bierze pod uwagę zezwolenie i za każdym razem, gdy wywołujemy metodę release() metoda zwraca zezwolenie semaforowi zliczającemu.

Fabryka wątków

ThreadFactory pomaga utworzyć pulę wątków, gdy jest to wymagane. Możemy utworzyć nowy wątek w puli wątków przy użyciu newThread(Runnable r) metoda w czasie wykonywania.

Phaser

Phaser to także elastyczna bariera, która blokuje wykonywanie wielu wątków. Wykonuje wiele wątków dynamicznie w oddzielnych fazach. Jest to bardziej elastyczne podejście w porównaniu do CyclicBarrier i CountDownLatch.

Atomowy

Interfejs atomowy jest częścią pakietu który udostępnia różne klasy do obsługi operacji atomowych, takich jak compareAndSet() . Ma różne klasy wymienione poniżej:

AtomicInteger: zapewnia zmienną całkowitą do odczytu i zapisu atomowego

AtomicLong: zapewnia zmienną Long do atomowego odczytu i zapisu

AtomicBoolean: zapewnia zmienną logiczną do atomowego odczytu i zapisu

AtomicReference: zapewnia zmienną odwołania do obiektu do atomowego odczytu i zapisu

AtomicStampedReference: zapewnia zmienną odwołania do obiektu do atomowego odczytu i zapisu

AtomicIntegerArray: reprezentuje tablicę wartości całkowitych służących do wykonywania niepodzielnych operacji

AtomicLongArray: reprezentuje tablicę długich wartości dla atomowości

AtomicReferenceArray: Reprezentuje tablicę zmiennych referencyjnych

Numer Referencyjny

Jarosław Kułak
Jarosław Kułak

Leave a Comment