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;
}
}