Commit e680e29f by Patryk Czarnik

Suma tablicy wielowątkowo - różne przykłady

parent 5ae24a87
package watki.podstawy;
import java.util.Arrays;
public class SumaTablicy2 {
public static void main(String[] args) {
final int SIZE = 1000_000;
int[] t = new int[SIZE];
Arrays.fill(t, 5);
System.out.println("Mam tablicę");
// Stwórz dwa wątki, z których każdy obliczy sumę z połowy tej tablicy:
// od 0 do 499_999 a drugi od 500_000 do 999_999
// (mogą wypisać swoje wyniki)
// (to będzie trudniejsze) - potem oblicza jest suma tych dwóch połówek, aby uzyskać sumę całej tablicy
long wyniki[] = new long[2];
Thread watek1 = new Thread(() -> {
long suma = 0;
for(int i = 0; i < t.length / 2; i++) {
suma += t[i];
}
System.out.println(suma);
wyniki[0] = suma;
});
Thread watek2 = new Thread(() -> {
long suma = 0;
for(int i = t.length / 2; i < t.length; i++) {
suma += t[i];
}
System.out.println(suma);
wyniki[1] = suma;
});
watek1.start();
watek2.start();
try {
watek1.join();
watek2.join();
} catch (InterruptedException e) {
}
// gdy oba wątki zakończone, można zsumować tablicę wyników
long sumaGlobalna = wyniki[0] + wyniki[1];
System.out.println("Suma ostateczna: " + sumaGlobalna);
}
}
package watki.podstawy;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicLong;
public class SumaTablicyAtomic {
public static void main(String[] args) {
System.out.println("Startujemy");
final int SIZE = 500_000_000;
int[] t = new int[SIZE];
Arrays.fill(t, 5);
System.out.println("Mam tablicę");
AtomicLong sumaGlobalna = new AtomicLong();
Thread watek1 = new Thread(() -> {
long suma = 0;
for(int i = 0; i < t.length / 2; i++) {
suma += t[i];
}
sumaGlobalna.addAndGet(suma);
});
Thread watek2 = new Thread(() -> {
long suma = 0;
for(int i = t.length / 2; i < t.length; i++) {
suma += t[i];
}
sumaGlobalna.addAndGet(suma);
});
long p = System.nanoTime();
watek1.start();
watek2.start();
try {
watek1.join();
watek2.join();
} catch (InterruptedException e) {
}
long k = System.nanoTime();
System.out.printf("Suma ostateczna: %s\n", sumaGlobalna);
System.out.printf("Czas działania: %.6f\n", (k-p)*1e-9);
}
}
package watki.podstawy;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicLong;
public class SumaTablicyAtomicWolno {
public static void main(String[] args) {
System.out.println("Startujemy");
final int SIZE = 500_000_000;
int[] t = new int[SIZE];
Arrays.fill(t, 5);
System.out.println("Mam tablicę");
AtomicLong sumaGlobalna = new AtomicLong();
Thread watek1 = new Thread(() -> {
for(int i = 0; i < t.length / 2; i++) {
sumaGlobalna.addAndGet(t[i]);
}
});
Thread watek2 = new Thread(() -> {
for(int i = t.length / 2; i < t.length; i++) {
sumaGlobalna.addAndGet(t[i]);
}
});
long p = System.nanoTime();
watek1.start();
watek2.start();
try {
watek1.join();
watek2.join();
} catch (InterruptedException e) {
}
long k = System.nanoTime();
System.out.printf("Suma ostateczna: %s\n", sumaGlobalna);
System.out.printf("Czas działania: %.6f\n", (k-p)*1e-9);
}
}
package watki.podstawy;
import java.util.Arrays;
public class SumaTablicyBezWatkow {
public static void main(String[] args) {
System.out.println("Startujemy");
final int SIZE = 500_000_000;
int[] t = new int[SIZE];
Arrays.fill(t, 5);
System.out.println("Mam tablicę");
long p = System.nanoTime();
long suma = 0;
for (int i = 0; i < t.length; i++) {
suma += t[i];
}
long k = System.nanoTime();
System.out.printf("Suma ostateczna: %s\n", suma);
System.out.printf("Czas działania: %.6f\n", (k - p) * 1e-9);
}
}
package watki.podstawy;
import java.util.Arrays;
public class SumaWieleWatkow {
static long sumaPrzedzialu(int[] tablica, int lewo, int prawo) {
// liczy sumę elementów od lewo włącznie do prawy wyłączając
long suma = 0;
for(int i = lewo; i < prawo; i++) {
suma += tablica[i];
}
return suma;
}
public static long sumaWieleWatkow(int[] tablica, int ileWatkow) {
long[] podsumy = new long[ileWatkow];
Thread[] watki = new Thread[ileWatkow];
for(int nr = 0; nr < ileWatkow; nr++) {
final int numer = nr;
final int lewy = (int)((long)nr * tablica.length / ileWatkow);
final int prawy = (int)((long)(nr+1) * tablica.length / ileWatkow);
watki[nr] = new Thread(() -> {
long sumaCzesciowa = sumaPrzedzialu(tablica, lewy, prawy);
podsumy[numer] = sumaCzesciowa;
});
}
for(int nr = 0; nr < ileWatkow; nr++) {
watki[nr].start();
}
// czekamy, aż wątki się zakończą i dodajemy ich podsumy do sumy ogólnej
long suma = 0;
try {
for(int nr = 0; nr < ileWatkow; nr++) {
watki[nr].join();
suma += podsumy[nr];
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return suma;
}
public static void main(String[] args) {
final int SIZE = 500_000_000;
int[] t = new int[SIZE];
Arrays.fill(t, 5);
System.out.println("Suma 8 wątków");
long p = System.nanoTime();
long suma = sumaWieleWatkow(t, 8);
long k = System.nanoTime();
System.out.printf("Suma ostateczna: %s\n", suma);
System.out.printf("Czas działania: %.6f\n", (k-p)*1e-9);
}
}
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