Liczenie sumy liczb pierwszych w wielu watkach.

0

Witam.
Probuje napisac program, ktory wylicza sume liczb pierwszych ponizej 2 000 000. Jednak ze wzgledu, ze trwalo to bardzo dlugo to chcialem zrobic to w wielu watkach. Kazdy watek ma liczyc czesc sumy. Jednak jak po uruchomieniu programu uruchamia sie tylko jeden watek, a eclipse otwiera mi klase Thread z zaznaczona linjka "throw new IllegalThreadStateException();" nie bardzo wiem o co mu biega bo kompilator nie zglasza zadnych bledow, program niby dalej dziala, ale nic sie nie dzieje. Prosilbym o pomoc z tym zagadnieniem :) Ponizej zamieszczam kod poszczegolnych klas.
Jest to moj pierwszy program wielowatkowy wiec prosze o wyrozumialosc. :)

PrimeSum - klasa, ktora uruchamia watki i udostepnia metody z ktorych watek moze sobie pobrac zakres dzialania.

public class PrimeSum {
	private int begin = 2;
	double sum = 2d;
	
	PrimeSum() {
		PrimeSumThread thread = new PrimeSumThread(this);
		for(int i = 0; i <= 100; i++) {
			thread.start();
		}
	}
	
	synchronized void sumThread(double prime) {
		sum += prime;
		System.out.println(sum);
	}
	synchronized int getBegin() {
		int temp = begin;
		if(begin == 2)
			begin = 0;
		begin += 20000;
		return temp;
	}
	synchronized int getEnd() {
		int temp = begin-1;
		return temp;
	}
}

 

PrimeSumThread - no, a to juz sama klasa watku. :)

 
public class PrimeSumThread extends Thread{
	PrimeSum pr;
	
	
	PrimeSumThread(PrimeSum pr) {
		this.pr = pr;
	}
	public void run() {
		System.out.println("Rozpoczecie watku: " + this.getName());
		int begin = pr.getBegin();
		int end = pr.getEnd();
		System.out.println(begin + " " + end);
		double sum = 0;
		IsPrime p = new IsPrime();
		for(int i = begin; i < end;i++){
			if(p.isPrime(i))
				sum += i;
		}
		pr.sumThread(sum);
		System.out.println("Konczenie watku: " + this.getName());
	}

}
0

Nie wiem co Ty kombinujesz, ale najprościej jak się da liczy mi 0.03s:
http://ideone.com/PSVoAm

0

@krwq: czy Twój algorytm na pewno daje dobre wyniki?

Wziąłem sobie pierwszą lepszą implementację sita i suma wychodzi mniejsza:

http://ideone.com/R44fCd

0

Wynik @krwq'a jest błędny. W javie, na komputerze domowym, mam czas tworzenia sita 43 ms, czas sumowania 6 ms.
http://ideone.com/DECJ9C - łączny czas poniżej 30 ms.

0

A po co tablica lczb pierwszych ? ;]
Moj program sprawdza czy liczba jest pierwsza i ja dodaje.
Co to jest sit, sita, czy jak to nazywacie ? ;P

Zalezy mi zeby ta suma byla liczona w wielu watkach jednoczesnie. :)

Zapomnialem dodac klase IsPrime :)
Moze macie jakis lepszy sposob na sprawdzenie czy liczba jest pierwsza bo przy wiekszych liczbach trwa to wiecznosc. :)

 
public class IsPrime {

	IsPrime(){}

	public Boolean isPrime(int number) {
		for(int i = 2; i < number; i++) {
			if(number%i == 0)
				return false;
		}
		return true;
	}

}
2

Wtf?

    public Boolean isPrime(int number) {
        for(int i = 2; i < number; i++) {
            if(number%i == 0)
                return false;
        }
        return true;
    }

Obowiązkowa modyfikacja:

    public Boolean isPrime(int number) {
        for(int i = 2; i <= Math.sqrt(number); i++) {
            if(number%i == 0)
                return false;
        }
        return true;
    }

A sito to szybszy sposób na znajdowanie liczb pierwszych z podanego zakresu.
W którym kodzie dopatrzyłeś się tablicy liczb pierwszych?
Brakuje jeszcze klasy z metodą main.

0

Tablice, ktora zobaczylem to sito Eratostenesa. ;]
Ma ktos moze pomysl, czemu petla z klasy PrimeSum, ktora powinna rozpoczac 100 watkow rozpoczyna tylko jeden i na tym program przestaje kontynuowac prace ? :)

public class Problem10 {
	
	
	public static void main(String[] args) {
		new PrimeSum();
	}

}
 
1

Próbujesz uruchamiać jeden wątek 100 razy.

    PrimeSum() {
        PrimeSumThread thread = new PrimeSumThread(this);
        for(int i = 0; i <= 100; i++) {
            thread.start();
        }
    }

Przenieś tworzenie wątków do pętli.
Po poprawkach (tworzenie wątków wewnątrz pętli, metoda isPrime), program kończy się szybko - poniżej sekundy, ale daje błędny wynik 161 644 312 565. Znajdź błąd samodzielnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1