Osnove konkurentnog i distribuiranog programiranja u Javi
Pored nezaobilazne preporučene literature iz konkurentnog i distribuiranog programiranja:
1. The Little Book of Semaphores, Allen B. Downey
2. Taming Java Threads, Allen Holub
3. Foundation of Multithreaded, Parallel and Distributed Programming, Gregory Andrews, Addison Wesley,2000
4. Konkurentno i distribuirano programiranje, Zaharije Radivojević, Igor Ikodinović, Zoran Jovanović, Akademska misao, 2008
korisno je pogledati sledeće video snimke sa praktičnih vežbi dr Zaharija Radivojevića, na Elektrotehničkom fakultetu Univerziteta u Beogradu.
Obrađene su sledeće oblasti:
1. Sinhronizacija niti
2. Distribuirano programiranje pomoću soketa
3. Udaljeni pozivi metoda (RMI)
Sa prvog snimka se može naučiti sledeće:
1. Osnove rada u razvojnom okruženju Eclipse
Download
2. Koncept poštanskog sandučeta (Message Box)
3. Izrada jednostavnog GUI-ja (pomoću Java Swing)
- Komponente JButton, JTextArea, JWindow
- Koncept Event-a (događaja) i Action listener-a.
4. Ponavljanje osnova programskog jezika Java
- paketi
- metode
- prosleđivanje argumenata
- definicija promenljivih
- klase
- interfejsi
- konstante
- gotove klase za rad sa listom i drugim strukturama podataka
- izuzeci
- događaji
- generičke klase
5. Koncept bounded buffer-a (kružnog bafera)
6. Sinhronizacija niti i rada poštanskog sandučeta pomoću interfejsa Lock i njegove implementacije ReentrantLock
Na drugom snimku se može videti:
1. Debagovanje u razvojnom okruženju Eclipse
2. Demonstracija i ispravljanje najčešćih grešaka u sinhronizaciji i GUI-ju
3. Implementacija poštanskog sandučeta koristeći ključnu reč synchronized
4. Implementacija poštanskog sandučeta koristeći nizove i semafore u Javi (u java.util.concurrent paketu)
Treći snimak:
1. Upoređivanje performansi prethodnih implementacija poštanskog sandučeta
2. Tokovi podataka u programskom jeziku Java
3. Implementacija poštanskog sandučetu u distribuiranom okruženju pomoću soketa
Četvrti snimak:
1. Implementacija poštanskog sandučeta pomoću udaljenih poziva metoda (RMI u Javi)
Svaka ispravka, bilo stručna, bilo u vezi izgleda teme je dobrodošla
Dopuna: 09 Dec 2012 21:34
Sinhronizacija niti pomoću ključne reči synchronized, metoda wait i notify
Deo koda ili metod se mogu deklarisati kao kritična sekcija korišćenjem ključne reči synchronized.
1. Deo koda synchronized (someObject) { ... }
U ovom slučaju, deo koda je kritična sekcija, a objekat odgovara uslovnom kritičnom regionu.
Naredba wait prekida izvršavanje niti i stavlja je u stanje čekanja. Privremeno se skida zabrana drugim nitima koje pristupaju monitoru.
wait(tmilisec) Čeka se najviše tmilisec milisekundi dok neka druga nit ne pozove notify() ili notifyAll() za taj objekat.
wait(tmilisec,tnanosec) Čeka se najviše tmilisec milisekundi i tnanosec nanosekundi dok neka druga nit ne pozove notify() ili notifyAll() za taj objekat.
wait() Čeka neograničeno dok neka druga nit ne pozove notify() ili notifyAll() za taj objekat.
4.Naredba notify()
Naredba notifyАll() šalje notifikaciju svim nitima koje čekaju da pristupe ciljnom objektu da to mogu učiniti.
Naredba notify() radi isto što i notifyАll(), ali notifikuje samo jednu nit.
Demonstriraćemo upotrebu ključne reči synchronized i pomenutih metoda u sinhronizaciji niti na primeru poštanskog sandučeta iz uvodnog dela članka.
public class ArrayMessageBox<T> implements MessageBox<T> {
Object[] buffer;
int first, last, size;
public ArrayMessageBox(int num) {
buffer = new Object[num];
first = 0;
last = 0;
size = 0;
}
public synchronized Message<T> get(long ttw, Status status) { //čitav metod je synchronized
while (size == 0) {
try {
wait(); //Čeka se da nešto ima u baferu.
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Message<T> result = (Message<T>) buffer[first];
first = (first + 1) % buffer.length;
size--;
notifyAll();// Sve niti se obaveštavaju da je nešto uzeto iz bafera - to će probuditi proizvođače koji čekaju slobodno mesto u baferu.
return result;
}
public synchronized void send(Message<T> m, Priority p, long ttl) { //čitav metod je synchronized
while (size == buffer.length) {
try {
wait(); //Čeka se da ima barem jedno slobodno mesto u baferu.
} catch (InterruptedException e) {
e.printStackTrace();
}
}
buffer[last] = m;
last = (last + 1) % buffer.length;
size++;
notifyAll(); //Sve niti se obaveštavaju da je nešto ubačeno u bafer - to će probuditi one potrošače koji čekaju da uzmu nešto iz bafera.
}
}