Wielowątkowość i synchronizacja są uważane za typowy rozdział w programowaniu w Javie. W firmach tworzących gry najczęściej zadawane są pytania podczas rozmów kwalifikacyjnych związane z wielowątkowością. Poniżej znajduje się lista często zadawanych pytań podczas rozmów kwalifikacyjnych dotyczących wielowątkowości i współbieżności języka Java.
Pytania do rozmowy kwalifikacyjnej dotyczące wielowątkowości
1) Co to jest wielowątkowość?
Wielowątkowość to proces jednoczesnego wykonywania wielu wątków. Aby uzyskać wielozadaniowość, stosuje się wielowątkowość. Zużywa mniej pamięci i zapewnia szybką i wydajną wydajność. Jego główne zalety to:
- Wątki korzystają z tej samej przestrzeni adresowej.
- Nić jest lekka.
- Koszt komunikacji pomiędzy procesami jest niski.
2) Jaki jest wątek?
Wątek jest lekkim podprocesem. Jest to osobna ścieżka wykonania, ponieważ każdy wątek działa w innej ramce stosu. Proces może zawierać wiele wątków. Wątki współdzielą zasoby procesu, ale mimo to wykonują się niezależnie.
Więcej szczegółów.3) Rozróżnij proces od wątku?
Istnieją następujące różnice między procesem a wątkiem.
- Program w trakcie wykonywania nazywany jest procesem, podczas gdy; Wątek jest podzbiorem procesu
- Procesy są niezależne, podczas gdy wątki stanowią podzbiór procesu.
- Procesy mają różną przestrzeń adresową w pamięci, podczas gdy wątki zawierają wspólną przestrzeń adresową.
- Przełączanie kontekstu między wątkami jest szybsze w porównaniu do procesów.
- Komunikacja między procesami jest wolniejsza i kosztowniejsza niż komunikacja między wątkami.
- Wszelkie zmiany w procesie nadrzędnym nie wpływają na proces podrzędny, podczas gdy zmiany w wątku nadrzędnym mogą wpływać na wątek podrzędny.
4) Co rozumiesz przez komunikację między wątkami?
- Proces komunikacji pomiędzy zsynchronizowanymi wątkami nazywany jest komunikacją między wątkami.
- Aby uniknąć odpytywania wątków w Javie, używana jest komunikacja między wątkami.
- Wątek zostaje wstrzymany w swojej sekcji krytycznej, a inny wątek może wejść (lub zablokować) w tej samej sekcji krytycznej w celu wykonania.
- Można to uzyskać metodami wait(), notify() i notifyAll().
5) Jaki jest cel metody Wait() w Javie?
Metoda wait() jest udostępniana przez klasę Object w Javie. Ta metoda jest używana do komunikacji między wątkami w Javie. Funkcja java.lang.Object.wait() służy do wstrzymania bieżącego wątku i zaczekania, aż inny wątek nie wywoła metody notify() lub notifyAll(). Poniżej podano jego składnię.
publiczna ostateczna nieważność czekaj()
6) Dlaczego metoda wait() musi zostać wywołana z bloku synchronizowanego?
Musimy wywołać metodę oczekiwania, w przeciwnym razie zostanie ona wyrzucona java.lang.IllegalMonitorStateException wyjątek. Ponadto potrzebujemy metody wait() do komunikacji między wątkami z notify() i notifyAll(). Dlatego musi być obecny w bloku zsynchronizowanym, aby zapewnić prawidłową i poprawną komunikację.
7) Jakie są zalety wielowątkowości?
Programowanie wielowątkowe ma następujące zalety:
- Wielowątkowość pozwala aplikacji/programowi zawsze reagować na wprowadzane dane, nawet jeśli już działają z niektórymi zadaniami w tle
- Wielowątkowość pozwala na szybsze wykonywanie zadań, ponieważ wątki wykonują się niezależnie.
- Wielowątkowość zapewnia lepsze wykorzystanie pamięci podręcznej, ponieważ wątki współdzielą wspólne zasoby pamięci.
- Wielowątkowość zmniejsza liczbę wymaganego serwera, ponieważ jeden serwer może wykonywać wiele wątków jednocześnie.
8) Jakie są stany w cyklu życia wątku?
Wątek może w trakcie swojego istnienia mieć jeden z następujących stanów:
9) Jaka jest różnica między planowaniem z wywłaszczaniem a cięciem czasu?
W przypadku planowania z wyprzedzeniem zadanie o najwyższym priorytecie jest wykonywane do momentu przejścia w stan oczekiwania lub stanu martwego lub do momentu pojawienia się zadania o wyższym priorytecie. W ramach podziału czasu zadanie jest wykonywane przez wstępnie zdefiniowany odcinek czasu, a następnie ponownie trafia do puli gotowych zadań. Następnie osoba planująca określa, które zadanie powinno zostać wykonane jako następne, na podstawie priorytetu i innych czynników.
10) Co to jest przełączanie kontekstu?
W przypadku przełączania kontekstu stan procesu (lub wątku) jest przechowywany, dzięki czemu można go przywrócić, a wykonanie można później wznowić od tego samego punktu. Przełączanie kontekstu umożliwia wielu procesom współdzielenie tego samego procesora.
11) Rozróżnij klasę Thread od interfejsu Runnable do tworzenia wątku?
Wątek można utworzyć na dwa sposoby.
- Rozszerzając klasę Thread
- Implementując interfejs Runnable
Jednak podstawowe różnice między obydwoma sposobami podano poniżej:
- Rozszerzając klasę Thread, nie możemy rozszerzać żadnej innej klasy, ponieważ Java nie pozwala na wielokrotne dziedziczenie podczas implementowania interfejsu Runnable; możemy również rozszerzyć inną klasę bazową (jeśli jest to wymagane).
- Rozszerzając klasę Thread, każdy z wątków tworzy unikalny obiekt i kojarzy się z nim podczas implementowania interfejsu Runnable; wiele wątków ma ten sam obiekt
- Klasa Thread udostępnia różne wbudowane metody, takie jak getPriority(), isAlive i wiele innych, natomiast interfejs Runnable udostępnia jedną metodę, tj. run().
12) Do czego służy metoda Join()?
Metoda Join() czeka na śmierć wątku. Innymi słowy, powoduje, że aktualnie działające wątki przestają działać, dopóki wątek, z którym się łączy, nie zakończy swojego zadania. Metoda Join jest przeciążona w klasie Thread w następujący sposób.
- public void Join() zgłasza wyjątek InterruptedException
- publiczne łączenie o pustkę (długie milisekundy) zgłasza wyjątek InterruptedException
13) Opisz cel i działanie metody Sleep().
Metoda Sleep() w Javie służy do blokowania wątku na określony czas, co oznacza, że wstrzymuje wykonywanie wątku na określony czas. Można to zrobić na dwa sposoby.
Składnia:
generator liczb losowych w c
- publiczny statyczny stan uśpienia (długie milisekundy) zgłasza wyjątek InterruptedException
- publiczny statyczny stan uśpienia (długie milisekundy, int nanos) zgłasza wyjątek InterruptedException
Działanie metody Sleep().
Kiedy wywołujemy metodę Sleep(), wstrzymuje ona wykonywanie bieżącego wątku na zadany czas i daje priorytet innemu wątkowi (jeśli jest dostępny). Co więcej, po upływie czasu oczekiwania poprzedni wątek ponownie zmienia swój stan z oczekiwania na możliwość uruchomienia i przechodzi w stan uruchomienia, a cały proces trwa aż do zakończenia wykonywania.
14) Jaka jest różnica między metodą Wait() a metodą Sleep()?
Czekać() | spać() |
---|---|
1) Metoda wait() jest zdefiniowana w klasie Object. | Metoda Sleep() jest zdefiniowana w klasie Thread. |
2) Metoda Wait() zwalnia blokadę. | Metoda Sleep() nie zwalnia blokady. |
15) Czy można rozpocząć wątek dwa razy?
Nie, nie możemy zrestartować wątku, ponieważ po uruchomieniu i wykonaniu wątku przechodzi on w stan Martwy. Dlatego też, jeśli spróbujemy uruchomić wątek dwukrotnie, zwróci się wyjątek runtimeException „java.lang.IllegalThreadStateException”. Rozważ następujący przykład.
public class Multithread1 extends Thread { public void run() { try { System.out.println('thread is executing now........'); } catch(Exception e) { } } public static void main (String[] args) { Multithread1 m1= new Multithread1(); m1.start(); m1.start(); } }
Wyjście
thread is executing now........ Exception in thread 'main' java.lang.IllegalThreadStateException at java.lang.Thread.start(Thread.java:708) at Multithread1.main(Multithread1.java:13)Więcej szczegółów.
16) Czy możemy wywołać metodę run() zamiast start()?
Tak, bezpośrednie wywołanie metody run() jest prawidłowe, ale nie będzie działać jako wątek, zamiast tego będzie działać jak normalny obiekt. Nie będzie przełączania kontekstu pomiędzy wątkami. Kiedy wywołujemy metodę start(), wywołuje ona wewnętrznie metodę run(), która tworzy nowy stos dla wątku, podczas gdy bezpośrednie wywołanie metody run() nie tworzy nowego stosu.
Znak ciągu JavaWięcej szczegółów.
17) A co z wątkami demonów?
Wątki demonów to wątki o niskim priorytecie, które zapewniają obsługę w tle i usługi wątkom użytkownika. Wątek demona zostaje automatycznie zakończony przez maszynę JVM, jeśli program pozostaje tylko z wątkiem demona, a wszystkie inne wątki użytkownika zostaną zakończone/umarły. W klasie Thread dostępne są dwie metody dla wątku demona:
18) Czy możemy utworzyć wątek użytkownika jako wątek demona, jeśli wątek jest uruchomiony?
Nie, jeśli to zrobisz, wygeneruje wyjątek IllegalThreadStateException. Dlatego wątek demona możemy utworzyć jedynie przed uruchomieniem wątku.
class Testdaemon1 extends Thread{ public void run(){ System.out.println('Running thread is daemon...'); } public static void main (String[] args) { Testdaemon1 td= new Testdaemon1(); td.start(); setDaemon(true);// It will throw the exception: td. } }
Wyjście
Running thread is daemon... Exception in thread 'main' java.lang.IllegalThreadStateException at java.lang.Thread.setDaemon(Thread.java:1359) at Testdaemon1.main(Testdaemon1.java:8)Więcej szczegółów.
19)Co to jest hak zamykający?
Hak zamykający to wątek wywoływany niejawnie przed zamknięciem JVM. Możemy więc go użyć do oczyszczenia zasobu lub zapisania stanu, gdy JVM zamyka się normalnie lub nagle. Możemy dodać hak zamykający, korzystając z następującej metody:
public�void�addShutdownHook(Thread�hook){}�� Runtime r=Runtime.getRuntime(); r.addShutdownHook(new MyThread());
Oto kilka ważnych punktów dotyczących haków zamykających:
- Zainicjowano zaczepy zamykające, ale można je uruchomić tylko po wyłączeniu maszyny JVM.
- Haki zamykające są bardziej niezawodne niż finalizator(), ponieważ istnieje znacznie mniejsze prawdopodobieństwo, że haki zamykające nie zostaną uruchomione.
- Hak zamykający można zatrzymać, wywołując metodę halt(int) klasy Runtime.
20) Kiedy powinniśmy przerwać wątek?
Powinniśmy przerwać wątek, gdy chcemy przerwać stan uśpienia lub oczekiwania wątku. Możemy przerwać wątek, wywołując funkcję przerwania() i zgłaszając wyjątek InterruptedException.
Więcej szczegółów.21) Jaka jest synchronizacja?
Synchronizacja to możliwość kontrolowania dostępu wielu wątków do dowolnego współdzielonego zasobu. To jest używane:
- Aby zapobiec zakłóceniom gwintu.
- Aby zapobiec problemom ze spójnością.
Kiedy wiele wątków próbuje wykonać to samo zadanie, istnieje możliwość uzyskania błędnego wyniku, dlatego też w celu usunięcia tego problemu Java wykorzystuje proces synchronizacji, który pozwala na wykonanie tylko jednego wątku na raz. Synchronizację można osiągnąć na trzy sposoby:
- metodą synchroniczną
- przez blok zsynchronizowany
- poprzez synchronizację statyczną
Składnia bloku zsynchronizowanego
synchronized(object reference expression) { //code block }Więcej szczegółów.
22) Jaki jest cel bloku synchronicznego?
Bloku Synchronized można użyć do przeprowadzenia synchronizacji dowolnego konkretnego zasobu metody. Na określonym zasobie może działać tylko jeden wątek na raz, a wszystkie inne wątki próbujące wejść do zsynchronizowanego bloku są blokowane.
- Blok synchronizowany służy do blokowania obiektu dla dowolnego współdzielonego zasobu.
- Zakres zsynchronizowanego bloku jest ograniczony do bloku, w którym jest zastosowany. Jej zakres jest mniejszy niż metoda.
23) Czy obiekt Java może zostać zablokowany do wyłącznego użytku przez dany wątek?
Tak. Możesz zablokować obiekt, umieszczając go w „zsynchronizowanym” bloku. Zablokowany obiekt jest niedostępny dla żadnego wątku innego niż ten, który wyraźnie go przejął.
24) Co to jest synchronizacja statyczna?
Jeśli zsynchronizujesz dowolną metodę statyczną, blokada będzie dotyczyć klasy, a nie obiektu. Jeśli użyjemy słowa kluczowego synchronized przed metodą, zablokuje ona obiekt (jeden wątek może uzyskać dostęp do obiektu na raz), ale jeśli użyjemy słowa kluczowego static synchronized, zablokuje to klasę (jeden wątek może uzyskać dostęp do klasy na raz). Więcej szczegółów.
25) Jaka jest różnica między notify() i notifyAll()?
Metoda notify() służy do odblokowania jednego oczekującego wątku, natomiast metoda notifyAll() służy do odblokowania wszystkich wątków w stanie oczekiwania.
26)Co to jest impas?
Zakleszczenie to sytuacja, w której każdy wątek oczekuje na zasób, który jest trzymany przez inny oczekujący wątek. W tej sytuacji żaden wątek nie jest wykonywany ani nie ma szans na wykonanie. Zamiast tego istnieje uniwersalny stan oczekiwania wśród wszystkich wątków. Zakleszczenie to bardzo skomplikowana sytuacja, która może złamać nasz kod w czasie wykonywania.
Więcej szczegółów.27) Jak wykryć stan zakleszczenia? Jak można tego uniknąć?
Możemy wykryć stan zakleszczenia, uruchamiając kod w cmd i zbierając zrzut wątku, a jeśli w kodzie występuje zakleszczenie, na cmd pojawi się komunikat.
Sposoby uniknięcia zakleszczenia w Javie:
28) Co to jest Harmonogram wątków w Javie?
W Javie, gdy tworzymy wątki, nadzoruje się je za pomocą Harmonogramu wątków, który jest częścią JVM. Harmonogram wątków jest odpowiedzialny jedynie za podjęcie decyzji, który wątek powinien zostać wykonany. Harmonogram wątków wykorzystuje dwa mechanizmy planowania wątków: wywłaszczanie i cięcie czasu.
if else instrukcja w JavieHarmonogram wątków Java działa również przy podejmowaniu decyzji o następujących kwestiach dla wątku:
- Wybiera priorytet wątku.
- Określa czas oczekiwania na wątek
- Sprawdza naturę nici
29) Czy każdy wątek ma swój stos w programowaniu wielowątkowym?
Tak, w programowaniu wielowątkowym każdy wątek utrzymuje swój własny lub oddzielny obszar stosu w pamięci, dzięki czemu każdy wątek jest od siebie niezależny.
30) Jak osiąga się bezpieczeństwo gwintu?
Jeśli metoda lub obiekt klasy może być używany przez wiele wątków jednocześnie bez żadnych warunków wyścigu, wówczas klasa jest bezpieczna dla wątków. Bezpieczeństwo wątków służy do zapewnienia bezpieczeństwa programu w programowaniu wielowątkowym. Można to osiągnąć następującymi sposobami:
- Synchronizacja
- Używanie słowa kluczowego Volatile
- Korzystanie z mechanizmu opartego na zamku
- Użycie atomowych klas opakowań
31) Co to jest stan wyścigowy?
Sytuacja wyścigu to problem występujący w programowaniu wielowątkowym, gdy różne wątki wykonują się jednocześnie i uzyskują dostęp do współdzielonego zasobu w tym samym czasie. Właściwe użycie synchronizacji pozwala uniknąć sytuacji wyścigu.
32) Jakie jest słowo kluczowe volatile w Javie?
Słowo kluczowe Volatile jest używane w programowaniu wielowątkowym w celu zapewnienia bezpieczeństwa wątków, ponieważ zmiana jednej zmiennej zmiennej jest widoczna dla wszystkich pozostałych wątków, dzięki czemu jedna zmienna może być używana przez jeden wątek na raz.
33) Co rozumiesz przez pulę wątków?
- Pula wątków Java reprezentuje grupę wątków roboczych oczekujących na przydzielenie zadania.
- Wątki w puli wątków nadzorowane są przez usługodawcę, który pobiera z puli jeden wątek i przypisuje mu zadanie.
- Po wykonaniu danego zadania wątek ponownie trafił do puli wątków.
- Rozmiar puli wątków zależy od całkowitej liczby wątków przechowywanych w rezerwie do wykonania.
Zalety puli wątków to:
- Używając puli wątków, można zwiększyć wydajność.
- Korzystanie z puli wątków może zapewnić lepszą stabilność systemu.
Pytania do rozmowy kwalifikacyjnej dotyczące współbieżności
34) Jakie są główne komponenty API współbieżności?
Concurrency API można rozwijać przy użyciu klasy i interfejsów pakietu java.util.Concurrent. W pakiecie java.util.Concurrent znajdują się następujące klasy i interfejsy.
- Wykonawca
- FarkDołącz do puli
- Usługa wykonawcy
- Usługa ScheduledExecutor
- Przyszły
- Jednostka czasu (Wyliczenie)
- OdliczanieZatrzask
- Bariera Cykliczna
- Semafor
- Fabryka wątków
- Blokowanie kolejki
- Kolejka opóźnień
- Zamki
- Fazer
35) Jaki jest interfejs Executora w Concurrency API w Javie?
Interfejs Executora dostarczony w pakiecie java.util.concurrent to prosty interfejs używany do wykonania nowego zadania. Metoda wykonywania() interfejsu Executora służy do wykonania danego polecenia. Poniżej podana jest składnia metody wykonywania().
nieważne wykonanie (polecenie możliwe do uruchomienia)
Rozważ następujący przykład:
import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class TestThread { public static void main(final String[] arguments) throws InterruptedException { Executor e = Executors.newCachedThreadPool(); e.execute(new Thread()); ThreadPoolExecutor pool = (ThreadPoolExecutor)e; pool.shutdown(); } static class Thread implements Runnable { public void run() { try { Long duration = (long) (Math.random() * 5); System.out.println('Running Thread!'); TimeUnit.SECONDS.sleep(duration); System.out.println('Thread Completed'); } catch (InterruptedException ex) { ex.printStackTrace(); } } } }
Wyjście
Running Thread! Thread Completed
36) Co to jest kolejka blokowania?
Java.util.concurrent.BlockingQueue to podinterfejs Queue, który obsługuje operacje takie jak oczekiwanie na dostępność miejsca przed wstawieniem nowej wartości lub oczekiwanie, aż kolejka nie stanie się pusta przed pobraniem z niej elementu. Rozważ następujący przykład.
import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class TestThread { public static void main(final String[] arguments) throws InterruptedException { BlockingQueue queue = new ArrayBlockingQueue(10); Insert i = new Insert(queue); Retrieve r = new Retrieve(queue); new Thread(i).start(); new Thread(r).start(); Thread.sleep(2000); } static class Insert implements Runnable { private BlockingQueue queue; public Insert(BlockingQueue queue) { this.queue = queue; } @Override public void run() { Random random = new Random(); try { int result = random.nextInt(200); Thread.sleep(1000); queue.put(result); System.out.println('Added: ' + result); result = random.nextInt(10); Thread.sleep(1000); queue.put(result); System.out.println('Added: ' + result); result = random.nextInt(50); Thread.sleep(1000); queue.put(result); System.out.println('Added: ' + result); } catch (InterruptedException e) { e.printStackTrace(); } } } static class Retrieve implements Runnable { private BlockingQueue queue; public Retrieve(BlockingQueue queue) { this.queue = queue; } @Override public void run() { try { System.out.println('Removed: ' + queue.take()); System.out.println('Removed: ' + queue.take()); System.out.println('Removed: ' + queue.take()); } catch (InterruptedException e) { e.printStackTrace(); } } } }
Wyjście
jak wyśrodkować obraz w css
Added: 96 Removed: 96 Added: 8 Removed: 8 Added: 5 Removed: 5
37) Jak zaimplementować problem producent-konsument przy użyciu BlockingQueue?
Problem producent-konsument można rozwiązać za pomocą BlockingQueue w następujący sposób.
import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.logging.Level; import java.util.logging.Logger; public class ProducerConsumerProblem { public static void main(String args[]){ //Creating shared object BlockingQueue sharedQueue = new LinkedBlockingQueue(); //Creating Producer and Consumer Thread Thread prod = new Thread(new Producer(sharedQueue)); Thread cons = new Thread(new Consumer(sharedQueue)); //Starting producer and Consumer thread prod.start(); cons.start(); } } //Producer Class in java class Producer implements Runnable { private final BlockingQueue sharedQueue; public Producer(BlockingQueue sharedQueue) { this.sharedQueue = sharedQueue; } @Override public void run() { for(int i=0; i<10; i++){ try { system.out.println('produced: ' + i); sharedqueue.put(i); } catch (interruptedexception ex) logger.getlogger(producer.class.getname()).log(level.severe, null, ex); consumer class in java implements runnable{ private final blockingqueue sharedqueue; public (blockingqueue sharedqueue) this.sharedqueue="sharedQueue;" @override void run() while(true){ system.out.println('consumed: '+ sharedqueue.take()); logger.getlogger(consumer.class.getname()).log(level.severe, < pre> <p> <strong>Output</strong> </p> <pre> Produced: 0 Produced: 1 Produced: 2 Produced: 3 Produced: 4 Produced: 5 Produced: 6 Produced: 7 Produced: 8 Produced: 9 Consumed: 0 Consumed: 1 Consumed: 2 Consumed: 3 Consumed: 4 Consumed: 5 Consumed: 6 Consumed: 7 Consumed: 8 Consumed: 9 </pre> <hr> <h3>38) What is the difference between Java Callable interface and Runnable interface?</h3> <p>The Callable interface and Runnable interface both are used by the classes which wanted to execute with multiple threads. However, there are two main differences between the both : </p> <ul> <li>A Callable interface can return a result, whereas the Runnable interface cannot return any result.</li> <li>A Callable interface can throw a checked exception, whereas the Runnable interface cannot throw checked exception. </li> <li>A Callable interface cannot be used before the Java 5 whereas the Runnable interface can be used.</li> </ul> <hr> <h3>39) What is the Atomic action in Concurrency in Java?</h3> <ul> <li>The Atomic action is the operation which can be performed in a single unit of a task without any interference of the other operations.</li> <li>The Atomic action cannot be stopped in between the task. Once started it fill stop after the completion of the task only. </li> <li>An increment operation such as a++ does not allow an atomic action.</li> <li>All reads and writes operation for the primitive variable (except long and double) are the atomic operation.</li> <li>All reads and writes operation for the volatile variable (including long and double) are the atomic operation.</li> <li>The Atomic methods are available in java.util.Concurrent package. </li> </ul> <hr> <h3>40) What is lock interface in Concurrency API in Java?</h3> <p>The java.util.concurrent.locks.Lock interface is used as the synchronization mechanism. It works similar to the synchronized block. There are a few differences between the lock and synchronized block that are given below.</p> <ul> <li>Lock interface provides the guarantee of sequence in which the waiting thread will be given the access, whereas the synchronized block doesn't guarantee it.</li> <li>Lock interface provides the option of timeout if the lock is not granted whereas the synchronized block doesn't provide that.</li> <li>The methods of Lock interface, i.e., Lock() and Unlock() can be called in different methods whereas single synchronized block must be fully contained in a single method.</li> </ul> <hr> <h3>41) Explain the ExecutorService Interface.</h3> <p>The ExecutorService Interface is the subinterface of Executor interface and adds the features to manage the lifecycle. Consider the following example.</p> <pre> import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class TestThread { public static void main(final String[] arguments) throws InterruptedException { ExecutorService e = Executors.newSingleThreadExecutor(); try { e.submit(new Thread()); System.out.println('Shutdown executor'); e.shutdown(); e.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException ex) { System.err.println('tasks interrupted'); } finally { if (!e.isTerminated()) { System.err.println('cancel non-finished tasks'); } e.shutdownNow(); System.out.println('shutdown finished'); } } static class Task implements Runnable { public void run() { try { Long duration = (long) (Math.random() * 20); System.out.println('Running Task!'); TimeUnit.SECONDS.sleep(duration); } catch (InterruptedException ex) { ex.printStackTrace(); } } } } </pre> <p> <strong>Output</strong> </p> <pre> Shutdown executor shutdown finished </pre> <hr> <h3>42) What is the difference between Synchronous programming and Asynchronous programming regarding a thread?</h3> <p> <strong>Synchronous programming: </strong> In Synchronous programming model, a thread is assigned to complete a task and hence thread started working on it, and it is only available for other tasks once it will end the assigned task.</p> <p> <strong>Asynchronous Programming: </strong> In Asynchronous programming, one job can be completed by multiple threads and hence it provides maximum usability of the various threads.</p> <hr> <h3>43) What do you understand by Callable and Future in Java?</h3> <p> <strong>Java Callable interface: </strong> In Java5 callable interface was provided by the package java.util.concurrent. It is similar to the Runnable interface but it can return a result, and it can throw an Exception. It also provides a run() method for execution of a thread. Java Callable can return any object as it uses Generic.</p> <p> <strong>Syntax:</strong> </p> <p>public interface Callable</p> <p> <strong>Java Future interface:</strong> Java Future interface gives the result of a concurrent process. The Callable interface returns the object of java.util.concurrent.Future.</p> <p>Java Future provides following methods for implementation.</p> <ul> <tr><td>cancel(boolean�mayInterruptIfRunning):</td> It is used to cancel the execution of the assigned task. </tr><tr><td>get():</td> It waits for the time if execution not completed and then retrieved the result. </tr><tr><td>isCancelled():</td> It returns the Boolean value as it returns true if the task was canceled before the completion. </tr><tr><td>isDone():</td> It returns true if the job is completed successfully else returns false. </tr></ul> <hr> <h3>44. What is the difference between ScheduledExecutorService and ExecutorService interface?</h3> <p>ExecutorServcie and ScheduledExecutorService both are the interfaces of java.util.Concurrent package but scheduledExecutorService provides some additional methods to execute the Runnable and Callable tasks with the delay or every fixed time period.</p> <h3>45) Define FutureTask class in Java? </h3> <p>Java FutureTask class provides a base implementation of the Future interface. The result can only be obtained if the execution of one task is completed, and if the computation is not achieved then get method will be blocked. If the execution is completed, then it cannot be re-started and can't be canceled.</p> <p> <strong>Syntax</strong> </p> <p>public class FutureTask extends Object implements RunnableFuture</p> <hr></10;>
38) Jaka jest różnica między interfejsem Java Callable a interfejsem Runnable?
Zarówno interfejs Callable, jak i Runnable są używane przez klasy, które chciały wykonać wiele wątków. Istnieją jednak dwie główne różnice między obydwoma:
- Interfejs Callable może zwrócić wynik, podczas gdy interfejs Runnable nie może zwrócić żadnego wyniku.
- Interfejs Callable może zgłosić sprawdzony wyjątek, podczas gdy interfejs Runnable nie może zgłosić zaznaczonego wyjątku.
- Interfejsu Callable nie można używać przed wersją Java 5, natomiast można używać interfejsu Runnable.
39) Jaka jest akcja atomowa w współbieżności w Javie?
- Akcja atomowa to operacja, którą można wykonać w pojedynczej jednostce zadania bez zakłócania innych operacji.
- Akcji Atomowej nie można zatrzymać pomiędzy zadaniami. Po uruchomieniu zatrzymuje się dopiero po zakończeniu zadania.
- Operacja zwiększania, taka jak a++, nie pozwala na akcję niepodzielną.
- Wszystkie operacje odczytu i zapisu zmiennej pierwotnej (z wyjątkiem operacji long i double) są operacjami niepodzielnymi.
- Wszystkie operacje odczytu i zapisu zmiennej lotnej (w tym operacje długie i podwójne) są operacjami niepodzielnymi.
- Metody Atomic są dostępne w pakiecie java.util.Concurrent.
40) Co to jest interfejs blokady w Concurrency API w Javie?
Jako mechanizm synchronizacji używany jest interfejs java.util.concurrent.locks.Lock. Działa podobnie do bloku zsynchronizowanego. Istnieje kilka różnic między blokadą a blokiem zsynchronizowanym, które podano poniżej.
- Interfejs Lock daje gwarancję kolejności, w jakiej oczekujący wątek otrzyma dostęp, natomiast blok synchronizowany tego nie gwarantuje.
- Interfejs blokady zapewnia opcję przekroczenia limitu czasu, jeśli blokada nie została przyznana, podczas gdy blok zsynchronizowany tego nie zapewnia.
- Metody interfejsu Lock, tj. Lock() i Unlock() można wywoływać różnymi metodami, przy czym pojedynczy zsynchronizowany blok musi być w całości zawarty w jednej metodzie.
41) Wyjaśnij interfejs ExecutorService.
Interfejs ExecutorService jest podinterfejsem interfejsu Executor i dodaje funkcje do zarządzania cyklem życia. Rozważ następujący przykład.
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class TestThread { public static void main(final String[] arguments) throws InterruptedException { ExecutorService e = Executors.newSingleThreadExecutor(); try { e.submit(new Thread()); System.out.println('Shutdown executor'); e.shutdown(); e.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException ex) { System.err.println('tasks interrupted'); } finally { if (!e.isTerminated()) { System.err.println('cancel non-finished tasks'); } e.shutdownNow(); System.out.println('shutdown finished'); } } static class Task implements Runnable { public void run() { try { Long duration = (long) (Math.random() * 20); System.out.println('Running Task!'); TimeUnit.SECONDS.sleep(duration); } catch (InterruptedException ex) { ex.printStackTrace(); } } } }
Wyjście
Shutdown executor shutdown finished
42) Jaka jest różnica między programowaniem synchronicznym a programowaniem asynchronicznym w odniesieniu do wątku?
Programowanie synchroniczne: W modelu programowania synchronicznego wątek jest przydzielany do wykonania zadania i dlatego wątek zaczyna nad nim pracować, a dla innych zadań jest dostępny dopiero po zakończeniu przydzielonego zadania.
Programowanie asynchroniczne: W programowaniu asynchronicznym jedno zadanie może być wykonane przez wiele wątków, co zapewnia maksymalną użyteczność różnych wątków.
43) Co rozumiesz przez Callable i Future w Javie?
Interfejs Java wywoływalny: W Javie5 wywoływalny interfejs był udostępniany przez pakiet java.util.concurrent. Jest podobny do interfejsu Runnable, ale może zwrócić wynik i zgłosić wyjątek. Udostępnia także metodę run() służącą do wykonywania wątku. Java Callable może zwrócić dowolny obiekt, ponieważ używa Generic.
Składnia:
interfejs publiczny Możliwość wywołania
Interfejs Java Future: Interfejs Java Future daje wynik współbieżnego procesu. Interfejs Callable zwraca obiekt java.util.concurrent.Future.
Java Future udostępnia następujące metody implementacji.
44. Jaka jest różnica pomiędzy interfejsem ScheduledExecutorService i ExecutorService?
Obydwa ExecutorServcie i ScheduledExecutorService są interfejsami pakietu java.util.Concurrent, ale zaplanowanyExecutorService udostępnia dodatkowe metody wykonywania zadań Runnable i Callable z opóźnieniem lub w ustalonych odstępach czasu.
45) Zdefiniuj klasę FutureTask w Javie?
Klasa Java FutureTask zapewnia podstawową implementację interfejsu Future. Wynik można uzyskać tylko wtedy, gdy wykonanie jednego zadania zostanie zakończone, a jeśli obliczenia nie zostaną wykonane, metoda get zostanie zablokowana. Jeśli wykonanie zostanie zakończone, nie można go rozpocząć ponownie ani anulować.
Składnia
klasa publiczna FutureTask rozszerza Obiekt implementuje RunnableFuture
10;>