Threads Threads richtig synchronisieren

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:

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:
 
Habs jetzt selber hinbekommen :toll:

War eigentlich ganz einfach. Man musste einfach nur aus dem hier:

Java:
public static void addPrime(long number){
	primes.add(number);
}
	
public static long getActNumber(){
	actNumber += 2;
	return actNumber - 2;
}

das hier machen:

Java:
public static void addPrime(long number){
synchronized(r){
	primes.add(number);
}
}

public static long getActNumber(){
synchronized(r){
	actNumber += 2;
	return actNumber - 2;
}
}
 

Thallius

Top Contributor
Sorry wenn ich das mal so direkt sage aber das ist der verkorkstere Code den ich seit langem gesehen habe.

Wozu gibt es eine Methode getActNumber wenn diese gar nicht ActNumber sondern ActNumber-2 zurück gibt? Was macht es für einen Sinn in einer get methode die zu Getter Variable zu ändern?. Das ist vollkommen paradox. Wieso setzt du ActNumber dann nochmal ++ direkt nach dem Aufruf von getActNumber?

Sorry aber dein Code ist vollkommen Konzeptlos.

Gruss

Claus
 
Hi,

das ist mir auch schon aufgefallen. Ich gebe zu dass man der Methode einen anderen Namen hätte geben sollen, sodass man besser erkennen kann was sie macht. Das werde ich wahrscheinlich auch noch abändern.
Zuvor hatte ich das komplette Programm allerdings noch in einer Klasse und habe dann direkt auf die Variable zugegriffen. Da es dann allmählich zu viel wurde hab ich ausgelagert und es ist die Methode dabei rausgekommen, die auf die Variable zugreift.
Die Methode getActNumber soll nur die aktuelle Zahl zurückgeben und dann zwei addieren. Da return aber der letzte befehl sein muss hab ich das so gelöst. Das ganze sieht zwar komisch aus und du hättest es wahrscheinlich anders gemacht aber sie tut was es soll.
Ein wenig Konzeptlos ist es tatsächlich. Zuerst solle es nur ein kleines Programm werden zum testen der Leistungsfähigkeit meines Raspberry Pis aber dann sind doch noch mehr Funktionen dazugekommen als ursprünglich gedacht.

Aber trotzdem danke für die Anmerkungen. Man kann ja nur aus Fehlern lernen wenn man weis dass es welche sind.
Ich werds beim nächsten mal bessed machen.

Gruss

Jonas
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
J Threads richtig beenden Java Basics - Anfänger-Themen 6
A lock bei Threads richtig einsetzen Java Basics - Anfänger-Themen 3
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Threads Java Basics - Anfänger-Themen 10
B synchronized threads Java Basics - Anfänger-Themen 17
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4
T Threads Join() = Block? oO Java Basics - Anfänger-Themen 4
J Threads ArrayList Problem bei Threads Java Basics - Anfänger-Themen 3
C Objekte durchschleifen / Threads Java Basics - Anfänger-Themen 2
J Threads stoppen mit interrupt - Frage dazu Java Basics - Anfänger-Themen 7
N Pingen in Threads Java Basics - Anfänger-Themen 9
B Threads benutzen Java Basics - Anfänger-Themen 5
E Allgemein Verständnissfrage zum Ablauf mehrerer Threads Java Basics - Anfänger-Themen 4
S Threads erzeugen Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben