Programy wielowątkowe w Javie są wykorzystywane przez obszerne pliki Połączenia i przyszłość. Mając wymaganą znajomość wątków i wielowątkowości, czytelnicy będą w stanie lepiej zrozumieć dyskusję w tym artykule. Jak wyjaśnię w tym artykule interfejs wywoływalny w Javie.
- Podsumowanie wątków
- Co to jest wywoływalny interfejs w Javie
- Powrót wywoływalnego interfejsu
- Cechy klasy wywoływanej i przyszłej
- Porównanie klas wywoływalnych i uruchamialnych
Podsumowanie wątków
Pozwólcie jednak, że przedstawię tylko krótkie wprowadzenie do pojęcia wątków. Wątek to osobna ścieżka wykonania, w przypadku gdy trzeba wykonać powtarzalne zadanie, pracę można podzielić na wiele zadań i przypisać je do wątków. Wielowątkowośćto nic innego jak przypisanie wielu wątków do równoległego wykonywania różnych zadań, aby szybko uzyskać wynik.
Co to jest wywoływalny interfejs w Javie
W przypadku języka Java 5 wprowadzono klasę „java.util.concurrent”. Ten wywoływalny interfejs został wprowadzony za pośrednictwem pakietu współbieżności, który wyglądał podobnie do interfejsu Runnable. Może również zwrócić dowolny obiekt i zgłosić wyjątek. Interfejs Java Callable używa Generics, umożliwiając w ten sposób zwracanie dowolnego typu obiektu. Struktura Executor udostępnia metodę submit () do wykonywania wywoływalnych implementacji w puli wątków. W rzeczywistości Java Executor Framework jest zgodny ze wzorcami WorkerThread.
W puli wątków użytkownicy mogą inicjować wątki za pomocą metody Executors.newFixedThreadPool (10) i odpowiednio przesyłać do niej zadanie. Runnable działa jako cel wątku, a publiczna metoda void run () jest obowiązkowo implementowana w celu zdefiniowania zadania. Zostanie to wykonane przez wątki w puli wątków. Na podstawie dostępności wątków w puli struktura wykonawcza przypisuje pracę (cel, który można uruchomić) do wątków.Jeśli wszystkie wątki są w użyciu, zadanie musi zostać wstrzymane. Po wykonaniu jednego zadania wątek wraca do puli jako dostępny wątek, który jest gotowy do przyjęcia przyszłych zadań. Callable jest podobna do Runnable i może zwrócić dowolny typ obiektu, gdy chcemy uzyskać wynik lub status z zadania.
c ++ jak sortować tablicę
Powrót wywoływalnego interfejsu
Java Callable zwraca java.util.concurrent. Java Future oferuje metodę anulowania (), aby wyeliminować powiązane zadanie wywoływalne. Jest to przeciążona wersja metody get (), w której można określić czas oczekiwania na wynik. Warto unikać bieżącego wątku, który może być zablokowany na dłuższy czas. Należy pamiętać, że metoda get jest metodą synchroniczną i dopóki funkcja wywoływana nie zakończy swojego zadania i nie zwróci wartości, będzie musiała czekać na wywołanie.
Istnieją również metody „isDone ()” i „isCancelled ()” do pobierania bieżącego stanu powiązanego zadania wywoływalnego. Rozważmy przykład, w którym należy znaleźć sumę wszystkich liczb od 1 do 100. Możemy zapętlić od 1 do 100 sekwencyjnie i na koniec dodać je. Inną możliwością jest dzielenie i podbijanie. W tej metodzie możemy pogrupować liczby w taki sposób, aby każda grupa miała dokładnie dwa elementy. Wreszcie możemy przypisać tę grupę do puli wątków. Dlatego każdy wątek równolegle zwraca sumę częściową, a następnie zbiera te sumy częściowe i dodaje je, aby uzyskać całą sumę.
Cechy klasy wywoływanej i przyszłej
Klasa wywoływalna jest interfejsem typu SAM i dlatego może być zaimplementowana w wyrażeniu lambda.
Klasa wywoływalna ma tylko jedną metodę „call ()”, która przechowuje cały kod potrzebny do wykonania asynchronicznego.
rzut vs rzuty vs rzucanie w java
W uruchamialnym środowisku interfejsu nie było możliwości zwrócenia wyniku obliczeń ani zgłoszenia sprawdzonego wyjątku. Natomiast w przypadku Callable zwracanie wartości i rzucanie zaznaczonego wyjątku jest dostępne.
Get () klasy Future może służyć do pobierania wyników po wykonaniu obliczeń. Użytkownicy mogą również sprawdzić, czy obliczenia zostały zakończone, czy nie, za pomocą metody done ().
Anulowanie obliczeń przy użyciu metody future.cancel () również jest dobrodziejstwem w niektórych aplikacjach.
Funkcja Get () nazywana jest wywołaniem blokującym i kontynuuje blokowanie do zakończenia obliczeń.
Porównanie klas wywoływalnych i uruchamialnych
Możliwość wywołania | Runnable |
Jest częścią „ java.util.concurrent ' pakiet od wersji Java 1.5 | Jest częścią pakietu java.lang od wersji Java 1.0 |
Sparametryzowany interfejs, taki jak Callable | Niesparametryzowany interfejs |
Potrafi zgłosić sprawdzony wyjątek | Nie może zgłosić sprawdzonego wyjątku |
Zawiera jedną metodę call (), która zwraca typ V, jest to to samo, co zdefiniowany parametr interfejsu „Type” | Tutaj zawiera pojedynczą metodę o nazwie run (), która zwraca wartość void |
Poniżej znajduje się prosty przykład zaimplementowanej wywoływalnej klasy Java, w której kod zwraca nazwę określonego wątku, który wykonuje zadanie po jednej sekundzie. Tutaj używamy struktury ekstraktora do wykonania 100 zadań równolegle z Java Future do wyniku przesłanych zadań. Pierwszy fragment to dane wyjściowe, a poniżej reprezentuje kod.
pakiet com.journaldev.threads import java.util.ArrayList import java.util.Date import java.util.List import java.util.concurrent.Callable import java.util.concurrent.ExecutionException import java.util.concurrent.ExecutorService import java .util.concurrent.Executors import java.util.concurrent.Future klasa publiczna MyCallable implementuje Callable {@Override public String call () rzuca Exception {Thread.sleep (1000) // zwraca nazwę wątku wykonującego to wywoływalne zadanie return Thread.currentThread () .getName ()} public static void main (String args []) {// Get ExecutorService z klasy narzędziowej Executors, rozmiar puli wątków to 10 ExecutorService executor = Executors.newFixedThreadPool (10) // utwórz listę do przechowywania Future obiekt powiązany z listą wywoływanąlist = new ArrayList () // Utworzenie instancji MyCallable Callable callable = new MyCallable () for (int i = 0 i<100 i++){ //submit Callable tasks to be executed by thread pool Future future = executor.submit(callable) //add Future to the list, we can get return value using Future list.add(future) } for(Future fut : list){ try { //print the return value of Future, notice the output delay in console // because Future.get() waits for task to get completed System.out.println(new Date()+ '::'+fut.get()) } catch (InterruptedException | ExecutionException e) { e.printStackTrace() } } //shut down the executor service now executor.shutdown() } }
Wyłączanie usług wykonawców
Kluczowym i ważnym aspektem, który pomija wielu programistów, jest zamknięcie usługi ExecutorService. Usługa ExecutorService jest niezbędna i jest tworzona z dodatkowymi elementami wątku. Należy pamiętać, że maszyna JVM zatrzymuje się tylko wtedy, gdy zatrzymane są wszystkie wątki niebędące demonami. Dlatego zwykłe zamknięcie usługi wykonawczej zapobiega zatrzymaniu maszyny JVM.
merge sort w c ++
Aby powiedzieć usłudze wykonawczej, że nie ma potrzeby uruchamiania wątków, należy zamknąć usługę.
Istnieją trzy sposoby wywołania zamknięcia:
- void shutdown () - Inicjuje uporządkowane zamknięcie, w którym wykonywane są wcześniej przesłane zadania, ale żadne nowe zadania nie są przyjmowane.
- Lista shutdownNow () - Próbuje zatrzymać wszystkie aktywnie wykonywane zadania, zatrzymuje przetwarzanie zadań oczekujących, a także zwraca listę zadań oczekujących na wykonanie.
- void awaitTermination () - To kontynuuje blokowanie do momentu zakończenia wykonywania wszystkich zadań po żądaniu zamknięcia lub przekroczeniu limitu czasu. Blokuje się również, gdy bieżący wątek zostanie przerwany. Wszystko zależy od tego, które zadanie jest pierwsze.
W ten sposób dochodzimy do końca artykułu Callable Interface in Java. Mam nadzieję, że zrozumiałeś przyszłe i wywoływalne interfejsy w Javie.
Sprawdź autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie. Szkolenie i certyfikacja J2EE i SOA firmy Edureka jest przeznaczony dla studentów i profesjonalistów, którzy chcą zostać programistami Java.
Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy na blogu „Interfejs wywoływalny w Javie”, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.