Informatyka I Interfejsy w Java. Przetwarzanie równoległe. Wątki. dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2017
Interfejsy w Java Pojęcie interfejsu w programowaniu Deklaracja interfejsu Implementacja interfejsu przez klasę Dziedziczenie interfejsów Przykłady implementacji interfejsów obsługi myszy oraz klawiatury w apletach Java
Pojęcie interfejsu Interfejs zbiór abstrakcyjnych metod Interfejs można interpretować jako klasę abstrakcyjną, która nie ma pól a wszystkie jej metody są publiczne IPojazd
Do czego służą interfejsy? Klasa w Java może dziedziczyć tylko z jednej klasy Relacja dziedziczenia wprowadza wspólne cechy we wszystkich pochodnych klasach Interfejsy pozwalają wprowadzić różnorodność: klasa może implementować wiele interfejsów na raz, przy czym mogą one realizować zupełnie odmienne nie związane ze sobą funkcje Np. obsługa myszy a klawiatury
Implementacja interfejsu przez klasę W nagłówku klasy należy dodać słowo kluczowe implements wraz z nazwą realizowanego interfejsu
Implementacja metod interfejsu Klasa powinna implementować wszystkie metody interfejsu
Dziedziczenie interfejsów Interfejsy podlegają dziedziczeniu jak każda klasa
Wybrane interfejsy apletu Java Aplet MouseListener MouseMotion Listener KeyListener ActionListener
Interfejs MouseListener Implementacja interfejsu w aplecie public class MojApplet extends JApplet implements MouseListener Włączenie nasłuchiwania zdarzeń myszy w aplecie public void init() { addmouselistener(this);
Metody interfejsu MouseListener mouseclicked mousepressed mousereleased mouseentered mouseexited Kliknięcie Wciśnięcie przycisku Zwolnienie przycisku Kursor myszy wszedł na obszar okno Kursor myszy wyszedł poza obszar okna
Obiekt MouseEvent Obiekt zawiera informacje dot. współrzędnych zdarzenia myszy oraz źródła zdarzenia (przycisk) Można sprawdzić m. innymi: Współrzędne miejsca wystąpienia zdarzenia int getx(), int gety() Przycisk myszy, który wywołał zdarzenie int getbutton() Stan klawiszy funkcyjnych boolean isaltdown(), boolean iscontroldown(),...
Interfejs MouseMotionListener Implementacja w programie interfejsu MouseMotionListener pozwala na bieżąco śledzić ruchy kursora myszy public class Animacja extends JApplet implements MouseMotionListener Implementacja interfejsu polega na zdefiniowaniu w kodzie programu dwóch metod public void mousedragged(mouseevent e) public void mousemoved(mouseevent e)
Interfejs KeyListener Implementacja interfejsu obsługi zdarzeń klawiatury Inicjalizacja interfejsu
Metody interfejsu KeyListener METODA keytyped keypressed OPIS Wprowadzono znak z klawiatury Klawisz został wciśnięty keyreleased Klawisz został zwolniony Obiekt KeyEvent przechowuje informacje o zdarzeniu: oznak getkeychar() okod klawisza getkeycode() olokalizację getkeylocation()
Przykład obsługi zdarzenia keypressed
Przetwarzanie równoległe. Wątki
Przetwarzanie sekwencyjne a równoległe Algorytm zakłada sekwencyjne wykonanie instrukcji w ramach jednostki obliczeniowej (procesor, rdzeń procesora, etc.) Długotrwałe operacje mogą blokować działanie całej jednostki Rozwiązanie problemu: równoległe wykonanie kodu na wielu jednostkach, wykonanie długotrwałych operacji poza głównym wątkiem aplikacji
Koncepcja równoległego wykonania zadań start Jeden program Instrukcje Menu użytkownika Długotrwałe obliczenia Obsługa zdarzeń Jedn. Oblicz. 1 finish Jedn. Oblicz. 2
Wątki w Java Wątek jest samodzielnym algorytmem Wątek ma początek i koniec, może posiadać argumenty i zwracać wynik Wątek może być wykonywany w tle, nie blokując głównej ścieżki programu class Thread
Obliczenia równoległe w Java Są realizowane z wykorzystaniem: 1) dziedziczenia z klasy Thread class Wątek extends Thread 2) implementacji interfejsu Runnable class Wątek implements Runnable
Uruchomienie wątku Uruchomienie wątku odbywa się poprzez wywołanie metody start (odziedziczonej z klasy Thread) Wątek A = new Wątek(); A.start();
Wykonanie wątku W celu wykonania obliczeń równoległych, należy umieścić odpowiednie instrukcje realizujące algorytm w metodzie run @Override public void run() { for(int i = 0; i<10; i++ ) { System.out.println("I= " + i); try { sleep(100); } catch (InterruptedException ex) {} } System.out.println("Wątek skończył robotę"); }
Zakończenie wątku Wątek jest kończony automatycznie po wyjściu z metody run Wewnątrz wątku można używać instrukcji sleep Nie należy zatrzymywać wątku poprzez wywołanie metody stop
Priorytety wątków Metoda setpriority() klasy Thread pozwala za ustawienie priorytetu wątku Standardowy priorytet Thread.NORM_PRIORITY Wysoki priorytet Thread.MAX_PRIORITY Niski priorytet Thread.MIN_PRIORITY
Zalety i wady wątków Zalety Pozwalają wykonywać obliczenia równoległe (w tym na jednym komputerze) Znacząco zwiększają wydajność (zależy od realizowanych algorytmów) Wady Jeśli procesy równoległe korzystają ze wspólnych zasobów, mogą pojawić się problemy Procesy mogą być zależne