class PrimProduzent extends Thread { private boolean fertig; void stopp(){fertig = true;} private PrimLager lager; private String name; PrimProduzent(PrimLager pL, String pN) { super(pN); lager = pL; name = pN; } public void run() { int prodNr = 0; while (!fertig) { while (lager.istVoll()) yield(); prodNr++; lager.einlagern(ntePrimZahl(prodNr)); } } static int ntePrimZahl(int n) { if ((n > 0) & (n <= maxPrimes)) // sind auf Lager return aPrimes[n-1]; // nicht auf Lager muss produziert werden int nextPrime = LastPrime + 2; while (!istPrim(nextPrime)) nextPrime +=2; LastPrime = nextPrime; return nextPrime; } static boolean istPrim(int n) { int TestFaktor = 1; for (int i = 1;;i++){ if (i < maxPrimes) TestFaktor = aPrimes[i]; else TestFaktor +=2; if (n%TestFaktor == 0) return false; if (TestFaktor*TestFaktor > n) return true; } } static final int maxPrimes = 1000; static int[] aPrimes = new int[maxPrimes]; static int LastPrime; static { int lmax = 5*maxPrimes; // Bessere Abschätzung für # Primes benutzen ! boolean [] lPrimes = new boolean[lmax]; for (int i = 0; i < lPrimes.length; i++) lPrimes[i] = true; int WurzelMax = (int) (Math.sqrt(2*lmax+3) / 2); int prim, Streichen; for (int i = 0; i <= WurzelMax; i++) if (lPrimes[i]) { // dann ist i Index einer Primzahl prim = i + i + 3; for ( Streichen = 2 * i * i + 6 * i + 3; Streichen < lmax; Streichen += prim) lPrimes[Streichen] = false; } int Anzahl = 0; for (int i = 0; i < lPrimes.length; i++) if (lPrimes[i]) Anzahl ++; if (Anzahl < maxPrimes) { System.out.println("Zu wenige Primzahlen gefunden"); System.exit(1); } aPrimes[0] = 1; for (int i=1, k=0; i < maxPrimes; i++){ while (!lPrimes[k]) k++; aPrimes[i] = k + k + 3; k++; } LastPrime = aPrimes[maxPrimes-1]; } }