ZSO 1

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;
	}
}
Ten wpis został opublikowany w kategorii PJWSTK, PJWSTK - ZSO. Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *