Programowanie w Javie

Transkrypt

Programowanie w Javie
Programowanie w Javie
Andrzej Czajkowski
Lista nr 0 – Debugger w Javie
Celem ćwiczenia jest poznanie podstawowych funkcji narzędzia debugera (odpluskwiacz) w
środowisku Eclipse. Po ukończeniu ćwiczenia student powinien umieć samodzielnie obsługiwać
narzędzie i wykonywać podstawowe instrukcje służące prześledzeniu wykonywania kolejnych etapów
programu jak i warunkowego zatrzymania wykonywania programu oraz śledzenia zmian wartości
obserwowanych zmiennych. Dzięki czemu student powinien umieć odnajdywać błędy zarówno
skutkujące przerwaniem programu jak i błędy skutkujące niepoprawnym wynikiem zwróconym przez
program.
Laboratorium
powstało
w
oparciu
o
instrukcję
na
stronie
http://www.vogella.de/articles/EclipseDebugging/article.html .
1. Przygotowanie do ćwiczenia.
1.1. Przed ćwiczeniem należy sprawdzić ustawienia interaktywnej pomocy pakietu Eclipse, to jest
konfigurację dokumentacji dla biblioteki rt.jar (Properties). Jeśli będzie to konieczne, to ustawić ścieżki
do pliku ze źródłami JRE oraz dokumentacją API (Javadoc). Przykładowe ustawienia dla źródła
(source):
D:/java/src.zip
ustawienie dla Javadoc z Internetu:
http://download.oracle.com/javase/6/docs/api/
Deklaracje danego typu lub funkcji można podglądać za pomocą klawiszy Shift+F2 (Navigate/Open
External Javadoc), a źródło przyciskając prawym klawiszem myszy i wybierając opcję Open
Declaration.
1.2. Sprawdzić ustawienia zmiennych środowiskowych (CLASSPATH).
1.3. Ustawić ścieżkę dla generatora dokumentacji Javadoc. W tym celu w oknie Window/Preferences,
w podkatalogu Javadoc należy wpisać ścieżkę do generatora Javadoc np. D:\java\bin\javadoc.exe.
2. Przebieg Ćwiczeń.
2.1
a) Utwórz w metodzie main() klasy Zad1a instrukcję wczytywania znaków z klawiatury i dopisywani ich w
pliku za pomocą klasy BufferedWriter. Na koniec działania wyświetl całą zapisaną dotychczas zawartość
pliku. Zamykanie pliku zrealizuj w bloku finally{}.
b) Przerób metodę main() z Zad 2.1 aby korzystała z klasy RandomAccessFile.
2.2 Zaimplementuj wyścig wątków o takim samym priorytecie (wykład 5) i sprawdź czy używany system
operacyjny segmentuje czas. Sprawdź wyniki wyścigu dla wątków o różnych priorytetach.
2.3 Utwórz interfejs Playable dziedziczący po interfejsie Runnable który zapewni metody play(), stop(),
isInUse() oraz setInUse(). Następnie utwórz klasy Mp3Player oraz AviPlayer, które zaimplementują interfejs
Playable. Obiekty tych klas w przypadku wywołania metody play() mają z odstępem co jedna sekunda
wyświetlać powiadomienie do czasu wywołania metody stop() (powiadomienie ma brzmieć „odtwarzacz
mp3 : gram”). Stworzone klasy powinny działać z zaproponowaną klasą MultimediaCenter.
public class MultimediaCenter {
private Vector<Playable> devices = new Vector<Playable>();
Playable getNotUsedDevice() {
for (Iterator<Playable> iterator = devices.iterator(); iterator
.hasNext();) {
Playable tmpDevice = iterator.next();
if (tmpDevice.setInUse())
return tmpDevice;
}
}
return null;
void addDevice(Playable device) {
devices.add(device);
}
public static void main(String[] args) {
MultimediaCenter myMultimediaCenter = new MultimediaCenter();
myMultimediaCenter.addDevice(new Mp3Player("odtwarzaczmp3"));
myMultimediaCenter.addDevice(new AviPlayer("odtwarzaczavi"));
Playable urzadzenie1 = myMultimediaCenter.getNotUsedDevice();
Playable urzadzenie2 = myMultimediaCenter.getNotUsedDevice();
Thread watek_urzadzenia1 = new Thread(urzadzenie1);
Thread watek_urzadzenia2 = new Thread(urzadzenie2);
watek_urzadzenia1.start();
watek_urzadzenia2.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
urzadzenie1.stop();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
urzadzenie2.stop();
}
}
2.4 Do klasy MultimediaCenter dodaj obiekt spełniające rolę zasobu – Głośniki (klasa powinna zawierać
takie metody jak : setInUse(), release() ):
Speakers speakers = new Speakers("głośniki firmy X");
Zmodyfikuj konstruktory klas Mp3Player oraz AviPlayer aby korzystały z przydzielonego („podłączonego”)
zasobu :
myMultimediaCenter.addDevice(new Mp3Player("odtwarzaczmp3",
myMultimediaCenter.speakers));
myMultimediaCenter.addDevice(new AviPlayer("odtwarzaczavi",
myMultimediaCenter.speakers));
Ponadto zmodyfikuj metody play() w stworzonych klasach aby korzystały przy wyświetlaniu z
przydzielonego aktualnie zasobu (powiadomienia powinny wyglądać np.: „odtwarzaczmp3 – gram na
głośniki firmy X). Należy pamiętać, że zasoby nie mogą być wykorzystywane w tym samym czasie przez
dwa urządzenia. Co się stanie gdy obie metody będą żądać dostępu do zasobu ? Jak rozwiązać konflikt ?