Ocean Lodowaty

Download Report

Transcript Ocean Lodowaty

Wyjątki
Wyjątki
●
●
●
●
●
●
problem, który wstrzymuje wykonanie metody
lub bloku
w aktualnym kontekście nie istnieje dość
przesłanek, aby poradzić sobie z trudnościami
wszystko co można zrobić to przekazać
problem dalej
wyjątek jest zwykłym obiektem
new alokuje pamięć i wywołuje konstruktor
dwa rodzaje konstruktorów
Zgłaszanie wyjątków
●
zgłaszając wyjątek:
1) tworzony jest obiekt wyjątku
2) ścieżka wykonania jest przerywana, obiekt
wyjątku jest „wyrzucany” z kontekstu
3) sterowanie przejmuje mechanizm obsługi
wyjątków
4) mechanizm poszukuje procedury obsługi
wyjątku
Przechwytywanie wyjątków
●
●
●
try {
// kod który może zgłosić wyjątek
} catch(Type1 id1) {
// obsługa wyjątku typu Type1
} catch(Type2 id2) {
// obsługa wyjątku typu Type2
} // itd.
dopasowywanie wyjątków
wyjątek obsłużony, po wejściu do sekcji catch
Rejestracja wyjątków
●
●
●
●
metody getMessage(), getLocalizedMessage()
metoda printStackTrace()
metody getClass(), getName(), getSimpleName()
class LogingException extends Exception {
private static Logger log =
Logger.getLogger("LoggingException");
public LogginException() {
StringWriter trace = new StringWriter();
printStackTrace(new PrintWriter(trace));
log.severe(trace.toString);
}
};
Własne wyjątki
RuntimeException
●
●
●
●
●
●
●
dziedziczymy po istniejącym typie
class SimpleException extends Exception {}
konstruktory
klasa wyjątków niesprawdzanych
najczęściej błąd programisty
kompilator nie wymusza ich specyfikacji
specyfikacja wyjątków:
void fun() throws Exc1, Exc2, Exc3 { // kod }
Klauzula finally
●
●
●
●
●
try {
// kod, który może zgłosić wyjątek typu A
} catch(A a) {
// obsługa wyjątku a
} finally {
// czynności wykonywane za każdym razem
}
wykonywana zawsze
konieczna do przywrócenia pierwotnego stanu
instrukcje return w bloku try
użycie return w bloku finally
Ograniczenia wyjątków
●
●
●
●
●
●
deklaracja niewyrzucanych wyjątków
„interfejs specyfikacji wyjątków” w klasach
pochodnych
Ograniczenia w konstruktorach:
brak możliwości przechwytywania wyjątków
wyjątki rzucane przez konstruktory
użycie zagnieżdżonych bloków try
wyjątki w konstruktorze a kod sprzątający
Inne informacje
●
●
●
●
●
●
●
●
metoda getStackTrace()
ponowne wyrzucanie wyjątków
metoda fillInStackTrace()
throw (Exception)e.fillInStackTrace()
sekwencje wyjątków
przekazywanie obiektu przyczyny
Error, Exception, RuntimeException
metoda initCause()
Kilka zasad
●
●
●
●
„Nie przechwytuj wyjątku jeśli nie wiesz co z
nim zrobić”
Try {
// kod, który może zwrócić wyjątek
} catch(Exception e) {
throw new RuntimeException(e);
}
metoda getCause()
zaraz po utworzeniu obiektu wymagającego
porządkowania zacznij blok try-finally
Współbieżność
Dlaczego współbieżność
●
●
●
●
●
często nie decyduje o tym programista
wielowątkowe są:
1) podstawowa klasa biblioteki www : servlet
2) biblioteki interfejsu użytkownika :
SWING, AWT
ZALETY:
szybkość
reaktywność
mechanizmy w Javie
Klasa Thread i definiowanie zadań
●
●
●
●
●
●
●
konstruktor Thread wymaga przekazania
obiektu zadania
metoda start()
niedeterminizm mechanizmu planowania
„rejestracja” wątków – garbage collector
interfejs Runnable
metoda run() - właściwy kod zadania
skojarzenie zadania z wątkiem
Definiowanie zadań - c.d.
●
●
●
●
●
●
●
interfejs Callable
typ ogólny z parametrem typowym
metoda call – właściwy kod zadania
metoda submit() klasy ExecutorService
sparametryzowane obiekty klasy Future
metoda isDone()
metoda get()
Zarządzanie wątkami
●
●
●
●
●
klasa Executor
brak jawnego zarządzania cyklem życia wątków
CachedThreadPool
FixedThreadPool
SingleThreadPool
●
metoda shutdown()
●
wytwórnie wątków - ThreadFactory
Obsługa wątków
●
●
●
●
●
●
metoda sleep() - klasa TimeUnit
metody getPriority(), setPriority()
Thread.yield();
wątki demony
metoda setDaemon(), isDaemon()
łączenie wątków – metoda join()
Przechwytywanie wyjątków
●
●
interfejs Thread.UncaughtExceptionHandler
w momencie likwidacji wątku automatycznie
uruchamiana jest metoda:
Thread.UncaughtExceptionHandler.uncaughtException
●
●
własna wytwórnia wątków: z każdym obiektem
Thread kojarzymy nowy egzemplarz
Thread.UncaughtExceptionHandler
domyślna procedura obsługi
nieprzechwyconych wyjątków:
Thread.setDafaultUncaughtExceptionHandler()
Współdzielenie zasobów
●
●
●
●
●
●
każdy obiekt posiada blokadę
metody synchronizowane, np. :
public synchronized void fun() {}
żadna inna metoda synchronizowana nie może
zostać wywołana dopóki pierwsza nie
zakończy się i nie zwolni blokady
wielokrotne pobieranie tej samej blokady
prywatne pola obiektów !
blokada dla każdej klasy statyczne metody synchronizowane
Współdzielenie zasobów - c.d.
●
●
●
●
●
●
blokady jawne - obiekty Lock
new ReentrantLock()
metody lock(), unlock()
Lock.lock();
try {
return;
} finally {
Lock.unlock();
}
metoda trylock()
metoda lockInterruptibly()
Atomowość i widoczność
●
●
●
●
●
●
słowo kluczowe volatile
nie spełnia roli, gdy wartość pola zależy od
poprzedniej wartości lub jest ograniczana
przez wartość innego pola
kiedy synchronizacja, a kiedy ulotność
operacje atomowe
atomowość a ulotność
klasy atomowe
Przerwania
●
●
●
●
●
●
●
●
metoda interrupt()
wyjątek InterruptedException
metoda Thread.interrupted()
metoda shutdownNow() na rzecz wykonawcy
metoda submit() zamiast execute()
submit() zwraca referencję Future<?>
z niedookreślonym parametrem typowym
metoda cancel()
ryzyko zawieszenia całego programu
wait(), notify(), notifyAll()
●
●
●
●
●
wait(), notify(), notifyAll() tylko w
synchronizowanej metodzie lub bloku kodu
zwalnianie blokady obiektu przez wait()
synchronized(x) {
x.notify();
}
wait() w pętli – aktywne oczekiwanie ?
notifyAll() - wybudzenie wszystkiego?
Inne mechanizmy synchronizacji
●
●
●
●
●
●
jawne blokady i obiekty Condition
tworzymy obiekt Lock, z niego następnie
tworząc Condition
metody await(), signal(), signalAll()
PipedWriter, PipedReader
brak konieczności jawnej synchronizacji
przerywalne operacje read() i write()
Inne mechanizmy synchronizacji
●
●
●
●
●
●
●
●
kolejki z hierarchii BlockingQueue
LinkedBlockingQueue i ArrayBlockingQueue
metody take() i put()
CountDownLatch
synchronizacja zadań wymuszająca
oczekiwanie na zakończenie operacji
wykonywanych przez inne zadania
metoda await()
metoda countDown()
zastosowanie jednorazowe
Inne mechanizmy synchronizacji
●
●
●
●
●
●
●
●
CyclicBarrier
możliwość regeneracji
akcja bariery implementująca Runnable
akcja wykonywana automatycznie po
wyzerowaniu licznika bariery
DelayedQueue
Implementuje Delayed, dziedziczy Comparable
możliwość wyjęcia obiektu tylko po upłynięciu
kwarantanny
metoda poll()
Inne mechanizmy synchronizacji
●
●
●
●
●
●
●
●
ScheduledThreadPoolExecutor
metody schedule(), scheduleAtFixedRate()
uruchamiamy zadania Runnable
Semaphore
metody acquire() i release()
SynchronousQueue
komunikacja synchroniczna
metody put() i take()