Commit 067dfbfa by Patryk Czarnik

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

parent 51cdd831
......@@ -8,7 +8,7 @@ public class Afrykarium3 {
public void wpuśćWycieczkę(int ilu) {
try {
// zmniejsza wartość semafora o ilu,
// zmniejsza wartość semafora o ilu,
// ale jeśli wartość semafora < ilu, to czeka, aż semafor uzyska odp. wartość.
miejsca.acquire(ilu); // -= akademicko : P
} catch(InterruptedException e) {
......
package watki.gotowe.kolekcje;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
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;
import java.util.concurrent.*;
/* 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
* - 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.
......
......@@ -3,8 +3,6 @@ package watki.gotowe.kolekcje;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadLocalRandom;
......
package watki.gotowe.kolekcje;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
import java.util.*;
public class OpakowywanieSync {
......@@ -13,6 +9,7 @@ public class OpakowywanieSync {
StringBuffer s;
Vector v;
Hashtable h;
// Współczesne ich wersje bez synchronizacji: StringBuilder, ArrayList, HashMap
List<String> zwykla = new ArrayList<>();
zwykla.add("Ala");
......@@ -35,7 +32,7 @@ public class OpakowywanieSync {
List<String> synchronizowana2 = Collections.synchronizedList(new ArrayList<>());
// 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
if(synchronizowana.size() > 0) {
// tutaj może coś zrobić inny wątek
......
......@@ -2,8 +2,6 @@ package watki.gotowe.kolekcje;
import java.util.concurrent.ArrayBlockingQueue;
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.
......
......@@ -77,7 +77,6 @@ class Konto {
if(kwota > saldo) {
throw new BrakSrodkow("Brak środków na koncie nr " + numer);
}
saldo -= kwota;
} finally {
lock.unlock();
......
......@@ -3,7 +3,6 @@ package watki.gotowe.pule;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class PuleWatkow {
......
package watki.gotowe.pule;
import java.util.concurrent.Callable;
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;
import java.util.concurrent.*;
public class PuleWatkowCallable {
......
......@@ -2,9 +2,7 @@ package watki.gotowe.rwlock;
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class CzytelnicyPisarze_Lock {
private Lock lock = new ReentrantLock();
......
......@@ -29,7 +29,6 @@ public class Przerwanie {
System.in.read();
// czekamy na ENTER i gdy zostanie naciśnięty, wywołamy interrupt na wątku
th.interrupt();
} catch (IOException e) {
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 {
@Override
public void run() {
System.out.println("Startuje wątek 2. id = " + Thread.currentThread().getId());
for(int i = 1; i <= 1000; i++) {
System.out.println("Wątek 2: " + i);
}
System.out.println("Koniec wątek 2.");
}
......
......@@ -23,7 +23,7 @@ public class Watki2_Join {
System.out.println("stan przed join: " + th1.getState());
// 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 {
th1.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