Hallo Community,
ich bin momentan dabei einen Primzahlenrechner zu programmieren. Soweit funktioniert auch alles gut. Ich habe einen Thread der die Primzahlen berechnet und einen der auf eingaben wartet. Nun würde ich gerne mehrere Threads zum berechnen starten damit das alles auch etwas schneller geht. Da sich die Threads beim schreiben nicht unterbrechen dürfen müssen die irgendwie synchronisiert werden oder die Methode zum Schreiben der Variable muss irgendwie geblockt werden sodass sie nur einmal aufgerufen werden kann. Nun weis ich trotz langer suche nicht wie ich das anstellen soll :bahnhof:.
Hier der Code den ich bisher geschrieben habe:
Den Teil mit dem Input habe ich mal weggelassen. Das ist ja eher unwichtig.
Soweit ich weis müssen nur die Methoden addPrime(long number) und getActNumber() aus der ersten klasse synchronisiert werden.
Kann mir vielleicht jemand von euch sagen wie ich das ganze jetzt synchronisiern kann?
PS: Ich weis dass der rechner total unefizient ist :toll:
ich bin momentan dabei einen Primzahlenrechner zu programmieren. Soweit funktioniert auch alles gut. Ich habe einen Thread der die Primzahlen berechnet und einen der auf eingaben wartet. Nun würde ich gerne mehrere Threads zum berechnen starten damit das alles auch etwas schneller geht. Da sich die Threads beim schreiben nicht unterbrechen dürfen müssen die irgendwie synchronisiert werden oder die Methode zum Schreiben der Variable muss irgendwie geblockt werden sodass sie nur einmal aufgerufen werden kann. Nun weis ich trotz langer suche nicht wie ich das anstellen soll :bahnhof:.
Hier der Code den ich bisher geschrieben habe:
Java:
package de.Jonas.Primzahlenrechner;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
public class Primzahlenrechner {
private static Scanner scan = new Scanner(System.in);
private static long actNumber = 2;
private static ArrayList<Long> primes = new ArrayList<Long>();
private static String[][] commands = {{"exit", "print", "write", "help"}, {"close the program", "print all primes", "write all primes in a file", "prints this help screen"}};
private static Rechner r;
private static InputListener ip;
private static Thread rt;
private static Thread ipt;
public static void main(String[] args){
r = new Rechner();
ip = new InputListener();
rt = new Thread(r);
ipt = new Thread(ip);
System.out.println("+----------Primzahlen-Rechner gestartet----------+");
addPrime(getActNumber());
actNumber++;
rt.start();
ipt.start();
}
public static void addPrime(long number){
primes.add(number);
}
public static long getActNumber(){
actNumber += 2;
return actNumber - 2;
}
}
Den Teil mit dem Input habe ich mal weggelassen. Das ist ja eher unwichtig.
Java:
package de.Jonas.Primzahlenrechner;
public class Rechner implements Runnable {
private long numberToCalculate = 0;
private long numberToDivide = 0;
@Override
public void run() {
while(true){
numberToCalculate = Primzahlenrechner.getActNumber();
numberToDivide = (numberToCalculate / 2) + 1;
if(numberToDivide <= 2){
Primzahlenrechner.addPrime(numberToCalculate);
}
else{
boolean b = true;
for(int i = 2; i < numberToDivide; i++){
if(numberToCalculate % i == 0){
b = false;
break;
}
}
if(b == true){
Primzahlenrechner.addPrime(numberToCalculate);
}
}
}
}
}
Soweit ich weis müssen nur die Methoden addPrime(long number) und getActNumber() aus der ersten klasse synchronisiert werden.
Kann mir vielleicht jemand von euch sagen wie ich das ganze jetzt synchronisiern kann?
PS: Ich weis dass der rechner total unefizient ist :toll: