Commit 067dfbfa by Patryk Czarnik

Ponowne wgranie przykładów dot wątków

parent 51cdd831
...@@ -8,7 +8,7 @@ public class Afrykarium3 { ...@@ -8,7 +8,7 @@ public class Afrykarium3 {
public void wpuśćWycieczkę(int ilu) { public void wpuśćWycieczkę(int ilu) {
try { try {
// zmniejsza wartość semafora o ilu, // zmniejsza wartość semafora o ilu,
// ale jeśli wartość semafora < ilu, to czeka, aż semafor uzyska odp. wartość. // ale jeśli wartość semafora < ilu, to czeka, aż semafor uzyska odp. wartość.
miejsca.acquire(ilu); // -= akademicko : P miejsca.acquire(ilu); // -= akademicko : P
} catch(InterruptedException e) { } catch(InterruptedException e) {
......
package watki.gotowe.kolekcje; package watki.gotowe.kolekcje;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.*;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
/* W tym przykładzie porównuję szybkość działania ConcurrentHashMap i zwykłwej HashMap opakowanej w synchronizedMap. /* W tym przykładzie porównuję szybkość działania ConcurrentHashMap i zwykłej HashMap opakowanej w synchronizedMap.
* Program tworzy N wątków, które operują na słowniku String→Integer w taki sposób, że * Program tworzy N wątków, które operują na słowniku String→Integer w taki sposób, że
* - losują liczbę od 1 do K - po konwersji na tekst staje się ona kluczem w słowniku, * - losują liczbę od 1 do K - po konwersji na tekst staje się ona kluczem w słowniku,
* - wykonują operację modyfikacji zawartości słownika pod tym kluczem; aby koszt losowania itp. nie zaszumił kosztu samej mapy, operacja jest powtarzana kilkukrotnie z tym samym kluczem. * - wykonują operację modyfikacji zawartości słownika pod tym kluczem; aby koszt losowania itp. nie zaszumił kosztu samej mapy, operacja jest powtarzana kilkukrotnie z tym samym kluczem.
......
...@@ -3,8 +3,6 @@ package watki.gotowe.kolekcje; ...@@ -3,8 +3,6 @@ package watki.gotowe.kolekcje;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
......
package watki.gotowe.kolekcje; package watki.gotowe.kolekcje;
import java.util.ArrayList; import java.util.*;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
public class OpakowywanieSync { public class OpakowywanieSync {
...@@ -13,6 +9,7 @@ public class OpakowywanieSync { ...@@ -13,6 +9,7 @@ public class OpakowywanieSync {
StringBuffer s; StringBuffer s;
Vector v; Vector v;
Hashtable h; Hashtable h;
// Współczesne ich wersje bez synchronizacji: StringBuilder, ArrayList, HashMap
List<String> zwykla = new ArrayList<>(); List<String> zwykla = new ArrayList<>();
zwykla.add("Ala"); zwykla.add("Ala");
...@@ -35,7 +32,7 @@ public class OpakowywanieSync { ...@@ -35,7 +32,7 @@ public class OpakowywanieSync {
List<String> synchronizowana2 = Collections.synchronizedList(new ArrayList<>()); List<String> synchronizowana2 = Collections.synchronizedList(new ArrayList<>());
// Jeśli wątek wykonuje kilka operacji pod rząd, to są one synchronizowane KAŻDA OSOBNO // Jeśli wątek wykonuje kilka operacji pod rząd, to są one synchronizowane KAŻDA OSOBNO
// Przykład błedu: // Przykład błędu:
// Jeśli wiele wątków będzie wykonywać taki kod, to dwa wątki mogą usuwać element z jednoelementowej listy -> błąd // Jeśli wiele wątków będzie wykonywać taki kod, to dwa wątki mogą usuwać element z jednoelementowej listy -> błąd
if(synchronizowana.size() > 0) { if(synchronizowana.size() > 0) {
// tutaj może coś zrobić inny wątek // tutaj może coś zrobić inny wątek
......
...@@ -2,8 +2,6 @@ package watki.gotowe.kolekcje; ...@@ -2,8 +2,6 @@ package watki.gotowe.kolekcje;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
// Kolejki blokujące mają dodatkowo metody take i put, które działają w sposób blokujący. // Kolejki blokujące mają dodatkowo metody take i put, które działają w sposób blokujący.
......
...@@ -77,7 +77,6 @@ class Konto { ...@@ -77,7 +77,6 @@ class Konto {
if(kwota > saldo) { if(kwota > saldo) {
throw new BrakSrodkow("Brak środków na koncie nr " + numer); throw new BrakSrodkow("Brak środków na koncie nr " + numer);
} }
saldo -= kwota; saldo -= kwota;
} finally { } finally {
lock.unlock(); lock.unlock();
......
...@@ -3,7 +3,6 @@ package watki.gotowe.pule; ...@@ -3,7 +3,6 @@ package watki.gotowe.pule;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class PuleWatkow { public class PuleWatkow {
......
package watki.gotowe.pule; package watki.gotowe.pule;
import java.util.concurrent.Callable; import java.util.concurrent.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class PuleWatkowCallable { public class PuleWatkowCallable {
......
...@@ -2,9 +2,7 @@ package watki.gotowe.rwlock; ...@@ -2,9 +2,7 @@ package watki.gotowe.rwlock;
import java.util.Random; import java.util.Random;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class CzytelnicyPisarze_Lock { public class CzytelnicyPisarze_Lock {
private Lock lock = new ReentrantLock(); private Lock lock = new ReentrantLock();
......
...@@ -29,7 +29,6 @@ public class Przerwanie { ...@@ -29,7 +29,6 @@ public class Przerwanie {
System.in.read(); System.in.read();
// czekamy na ENTER i gdy zostanie naciśnięty, wywołamy interrupt na wątku // czekamy na ENTER i gdy zostanie naciśnięty, wywołamy interrupt na wątku
th.interrupt(); th.interrupt();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
}; };
......
package watki.gotowe.tworzenie;
public class Watek12_Program {
public static void main(String[] args) {
Watek1_Extends watek1 = new Watek1_Extends();
Watek2_Runnable trescWatku2 = new Watek2_Runnable();
Thread watek2 = new Thread(trescWatku2);
// "klasa anonimowa", do Java 7 był to najbradziej zwięzły zapis
Thread watek3 = new Thread(new Runnable() {
public void run() {
System.out.println("Startuje wątek 3. id = " + Thread.currentThread().getId());
for(int i = 1; i <= 1000; i++) {
System.out.println("Wątek 3: " + i);
}
System.out.println("Koniec wątek 3.");
}
});
// "wyrażenie lambda"
Thread watek4 = new Thread(() -> {
System.out.println("Startuje wątek 4. id = " + Thread.currentThread().getId());
for(int i = 1; i <= 1000; i++) {
System.out.println("Wątek 4: " + i);
}
System.out.println("Koniec wątek 4.");
});
watek1.start();
watek2.start();
watek3.start();
watek4.start();
System.out.println("Koniec main");
}
}
...@@ -5,11 +5,9 @@ public class Watek2_Runnable implements Runnable { ...@@ -5,11 +5,9 @@ public class Watek2_Runnable implements Runnable {
@Override @Override
public void run() { public void run() {
System.out.println("Startuje wątek 2. id = " + Thread.currentThread().getId()); System.out.println("Startuje wątek 2. id = " + Thread.currentThread().getId());
for(int i = 1; i <= 1000; i++) { for(int i = 1; i <= 1000; i++) {
System.out.println("Wątek 2: " + i); System.out.println("Wątek 2: " + i);
} }
System.out.println("Koniec wątek 2."); System.out.println("Koniec wątek 2.");
} }
......
...@@ -23,7 +23,7 @@ public class Watki2_Join { ...@@ -23,7 +23,7 @@ public class Watki2_Join {
System.out.println("stan przed join: " + th1.getState()); System.out.println("stan przed join: " + th1.getState());
// wątek main czeka na zakończenie wątków th1, th2, th3 // wątek main czeka na zakończenie wątków th1, th2, th3
// jeśli one się skończyły wcześniej, to od razu przechodzi dalej // jeśli one się skończyły wcześniej, to od razu przechodzi dalej
try { try {
th1.join(); th1.join();
th2.join(); th2.join();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment