Mine.java
import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Mine { public static void main(String[] args) throws InterruptedException, ExecutionException { int cykli = 1000000000; int ilosc = 100; // ilosc wątków na które podzielimy cykle long s = System.currentTimeMillis(); // tworze executor z okreslona iloscia watkow ExecutorService executorService = Executors.newFixedThreadPool(ilosc); // tworze zbior objektow do odpalenia Set<CallowalnaKlasa> callables = new HashSet<CallowalnaKlasa>(); double step = 1.0 / (double)cykli; for(int i = 0; i < ilosc; i++) { // tworze obiekty ktore bede odpalal, // do konstruktora moge im przekazac jakies unikalne cechy CallowalnaKlasa x = new CallowalnaKlasa((cykli / ilosc) * i, cykli / ilosc, step); // dodaje je do listy callables.add(x); } // egzekutor odpala wszystkie objekty w watkach List<Future<Double>> x = executorService.invokeAll(callables); Double pi = 0.0; for(Future<Double> wynik : x) { // a tu pobieram wyniki obliczen jak sie skoncza pi += wynik.get(); } long e = System.currentTimeMillis(); // wylaczam egzekutor (kasuje watki) executorService.shutdown(); System.out.println("Wartosc liczby PI wynosi " + pi); System.out.println("Czas przetwarzania wynosi " + ((double)(e - s) / 1000) + " sekund"); } }
CallowalnaKlasa.java
import java.util.concurrent.Callable; public class CallowalnaKlasa implements Callable<Double> { long iloscKrokowDlaDanegoWatka = 0; double krok; int odKtoregoKrokuZaczac = 0; CallowalnaKlasa(int od, long num, double step) { odKtoregoKrokuZaczac = od; iloscKrokowDlaDanegoWatka = num; krok = step; } @Override public Double call() throws Exception { double x, pi, sum = 0.0; for(int i = odKtoregoKrokuZaczac; i < odKtoregoKrokuZaczac + iloscKrokowDlaDanegoWatka; i++) { x = (i + 0.5) * krok; sum = sum + 4.0 / (1.0 + x * x); } pi = sum * krok; return (Double) pi; } }