Threads MultiThreading NullPointerException

Hi Community,

ich habe mal wieder ein Problem mit meinem aktuellen Projekt. Ich versuche mich gerade in Mutithreading einzuarbeiten. Das synchronisieren der Threads funktioniert schonmal gut nur ich bekomme eine NullPointerException wenn ich mehrere Threads erstelle. Das komische ist, dass der Fehler nur manchmal kommt und in welchen Threads er kommt ist auch unterschiedlich. Mal in keinem mal in mehreren, aber mir ist noch nie aufgefallen dass er in allen kommt.

Hier erstelle ich die Threads in der Main Methode:
Java:
Rechner[] r = new Rechner[4];
Thread[] rt = new Thread[4];
		
for(int i = 0; i < rt.length; i++){
	r[i] = new Rechner(primes);

	rt[i] = new Thread(r[i]);
	rt[i].start();
}

Und hier bekomme ich den Fehler in Zeile 30 (Fett geschriebene Zeile):
Java:
package de.Jonas.Primzahlenrechner;

import java.util.ArrayList;
import java.util.List;

public class Rechner implements Runnable {

	private long numberToCalculate = 0;
	private long numberToDivide = 0;
	
	private List<Long> primes = new ArrayList<Long>();

	public Rechner(List<Long> primes){
		this.primes = primes;
	}
	
	
	@Override
	public void run() {
		
		while(true){			
			
			numberToCalculate = Primzahlenrechner.getActNumber();
			numberToDivide = (numberToCalculate / 2) + 1;
						
			if(this.numberToCalculate % 2 != 0){
				boolean b = true;
								
				for(int i = 0; i < this.primes.size(); i++){
					[B]if(this.primes.get(i) < this.numberToDivide){[/B]
						if(this.numberToCalculate % this.primes.get(i) == 0){
							b = false;
							break;
						}
					}
				}
				
				if(b == true){
					Primzahlenrechner.addPrime(numberToCalculate);
				}
			}
		}
	}
}

Nur das komische daran ist, dass ich eine Zeile darüber noch auf das Objekt zugreifen kann ohne dass ich eine Exception bekomme. Wenn ich in Zeile 25 noch ein System.out.println(" "); einfüge läuft alles ohne probleme nur das möchte ich nicht da es eigentlich eine konsolenanwendung bleiben sollte.

Kann mir vielleicht jemand dabei helfen?

Grüße

Jonas
 

Bug Fisher

Bekanntes Mitglied
Das ist zwar nicht die Ursache aber Quatsch wie du sicher selbst siehst.

Java:
private List<Long> primes = new ArrayList<Long>();
 
public Rechner(List<Long> primes){
    this.primes = primes;
}

so sollte es sein, nicht ?
Java:
private final List<Long> primes;
 
public Rechner(List<Long> primes){
    this.primes = primes;
}

Der Fehler kann eigentlich nur daher kommen, dass die 'primes' Liste nicht korrekt synchronisiert ist.
Entweder du baust das selbst, nutzt Collections.synchronizedList(), oder, was ich am schönsten finde:

Freunde dich mit Callable<> an, lasse jeden Thread eine höchsteigene Liste zurückgeben, und führe am Ende alles zusammen. -> Thread.join()

Noch highleveliger wäre das Nutzen eines Threadpool mit Hilfe von zB. ExecutorService.newFixedThreadPool()
und der Future<> Klasse.

Oh, ich sehe gerade, dass
Java:
Primzahlenrechner.getActNumber()
auch konkurrierend aufgerufen wird; ist das ebenfalls korrekt synchronisiert ?
 
Zuletzt bearbeitet:
Das ist zwar nicht die Ursache aber Quatsch wie du sicher selbst siehst.

Java:
    private List<Long> primes = new ArrayList<Long>();
     
    public Rechner(List<Long> primes){
    this.primes = primes;
    }


so sollte es sein, nicht ?

Java:
    private final List<Long> primes;
     
    public Rechner(List<Long> primes){
    this.primes = primes;
    }

Ja genau. Das hab ich wohl vergessen wieder zu ändern.


Ich habe alle Zugriffe auf die Liste synchronisiert indem ich die Methoden mit synchronized versehen habe. (Also public static synchronized void...)


Mit Callable wäre es möglich. Allerdings habe ich momentan eine weitere Klasse die auf Eingaben wartet. Diese kann dann unter anderem alle errechneten Primzahlen ausgeben. Das wäre dann doch nur möglich wenn ich jeden Thread nur kleine Zahlenräume rechnen lasse (z.B. 100 Zahlen). Außerdem benötigt bei meiner Rechenmethode jeder Thread jede Primzahl die kleiner oder gleich der hälfte der aktuellen Zahl ist. Das wäre dann doch nicht möglich weil nicht auf alle errechneten Zahlen zugegriffen werden kann, oder?
Wäre es dann nicht besser wenn man jeden Thread nur eine Zahl errechnen lässt und dann jeweils für jeden fertigen Thread einen neuen startet?


Das:
Java:
Primzahlenrechner.getActNumber()
habe ich genauso synchronisiert wie die Methoden die auf 'primes' zugreifen. Das sollte auch funktionieren, da ich bis jetzt noch keine Primzahl mehrfach in der Liste gefunden habe.
 

Bug Fisher

Bekanntes Mitglied
Hmm, wirklich ne NullPointer... wo, wann und in welchem Thread erstellst du denn die Liste, die du an alle Rechner-Instanzen weitergibst ?

Mit Callable wäre es möglich. Allerdings habe ich momentan eine weitere Klasse die auf Eingaben wartet. Diese kann dann unter anderem alle errechneten Primzahlen ausgeben. Das wäre dann doch nur möglich wenn ich jeden Thread nur kleine Zahlenräume rechnen lasse (z.B. 100 Zahlen).
Ja, ich habe grad gesehen, dass du quasi endlos reinpackst, bis du das alles abbrichst.
Das könnte man ja ändern, dass du immer zB in 1000er chunks oder so erhöst.

Für die Ergebnisse zum Anzeigen, böte sich eine ArrayBlockingQueue<> an, so liesse sich das leicht synchronisieren; die Queue hat ne Obergrenze, und das Reinpacken blockiert dann so lange, bis wieder Platz ist. Das Rausnehmen blockiert, wenn nichts zu holen ist.

BTW: Dein Algorithmus hat einen Denkfehler: Du brauchst NICHT die Primzahlen bis n/2 sondern nur bis sqrt(n). Lässt sich aus der Primfaktorzerlegung ableiten.

Du könntest statt dessen auch das Sieb des Erathosthenes anwenden und wiederrum jedem Thread eine eigene Liste erstellen, die nur der eine Thread modifiziert. Diese fertige Teilliste könnte er dann dem Thread in die Queue packen,der das anzeigen übernimmt. Dass du je mehr Performance durch Overhead einbüsst, je mehr du synchronisierst sollte dir klar sein. Bei grossen Primzahlen ist das wichtig.
 
Ja es ist leider wirklich eine NullPointerException. Die Liste erstelle ich direkt vorher. Also ebenfalls in der Main Methode.
Mir ist gerade noch aufgefallen dass ich beim posten wohl was falsch gemacht habe. Der Fehler tritt nicht in Zeile 30 sondern in Zeile 31 auf. Da ist ganz oben wohl noch eine Zeile mit dazu gekommen als ich den Code kopiert habe. Eine Zeile davor greift er noch ohne Probleme auf die Größe der Liste zu. Und der Fehler kommt wie gesagt nicht in allen Threads wenn er denn überhaupt kommt.

Mir ist gerade aufgefallen, dass wenn ich das immer in Blöcken berechnen lasse es doch nicht möglich ist bei den kleineren Zahlen die Primzahlen richtig berechnen zu lassen. Denn wenn ich z.B. zwei Threads starte (einer von 2 - 1000 der andere von 1001 - 2000) ist die Liste mit allen Primzahlen noch leer. Also würde der Algorithmus in dem zweiten Thread nicht richtig rechnen, da er keine Liste mit den kleinen Primzahlen hat. Somit wären laut dem Algorithmus alle Zahlen Primzahlen.

Das mit der Wurzel von n hört sich gut an. Das werde ich gleich mal abändern. Das Sieb des Erathosthenes braucht aber glaube ich mehr Rechenzeit als mein Algorithmus da man auch jedes Vielfaches markieren muss.
 
Zuletzt bearbeitet:
Ich habe das Problem jetzt selber gelöst! :D. Ich habe jetzt das:
Java:
this.primes = new ArrayList<Long>(Primzahlenrechner.getPrimes());
in die while schleife gepackt und dafür den Construktor gelöscht.
Damit erstellt sich jeder Thread eine eigene Liste in der alle Primzahlen stehen die unabhängig von der Hauptliste ist. Damit läuft er jetzt zwar nicht mehr so schnell wie vorher aber ich bekomme keine NullPointerException mehr.

Danke für deine Hilfe.
 

Bug Fisher

Bekanntes Mitglied
Damit erstellt sich jeder Thread eine eigene Liste in der alle Primzahlen stehen die unabhängig von der Hauptliste ist. Damit läuft er jetzt zwar nicht mehr so schnell wie vorher aber ich bekomme keine NullPointerException mehr.
Das klingt erstmal gut - wenn es so jetzt aber erst geht, aber ich bin mir sicher, dass du da irgendwo an anderer Stelle was falsch machst, denn primes wäre der einzige Kandidat für eine NPE gewesen (auch in den anderen Zeilen der run()) und kann nur versehentlich genullt werden - wenn du dem jetzt doch noch auf den Grund gehen willst, würde ich dir raten, mit dem debugger mal den "Weg" dieser Liste primes Schritt für Schritt nachzuvollziehen. Auftreten wird der Fehler wärend des debuggens dann zwar ziemlich sicher nicht - dazu musst du dir dann an jeder Stelle überlegen, "was wenn jetzt genau hier ein anderer Thread..."

Das Sieb des Erathosthenes braucht aber glaube ich mehr Rechenzeit als mein Algorithmus
Das stimmt nicht. Aber das kannst du selbst nachlesen.
 
Das stimmt nicht. Aber das kannst du selbst nachlesen.

Da habe ich wohl zuerst was falsch verstanden. Jetzt habe ich den Pseudocode von Wikipedia mal in Java übersetzt und weis jetzt wie er funktioniert :). Allerding bin ich mir sicher dass man den Algorhitmus nicht in Multithreading laufen lassen kann, da dieser Algorhitmus auf den ersten Zahlen aufbaut. Aber das ist jetzt auch egal da mein aktueller Code mehr als doppelt so schnell auf einem Prozessorkern läuft als der alte auf vier Kernen :D. Vielleicht lässt sich daran auch noch was optimieren.

Danke für deine Hilfe
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L NullpointerException wegen wahrscheinlichem Multithreading Java Basics - Anfänger-Themen 4
buzzlightyeah multithreading Java Basics - Anfänger-Themen 4
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
I Threads Multithreading, Producer/Consumer, notify() Java Basics - Anfänger-Themen 6
M Mehre Dateien parallel kopieren mit Multithreading Java Basics - Anfänger-Themen 8
kilopack15 Verzweiflung wegen Berechnung mit Multithreading Java Basics - Anfänger-Themen 1
P Multithreading in Java Java Basics - Anfänger-Themen 9
N Threads Read-Modify-Write Problem bei Multithreading (philosopher dining problem) Java Basics - Anfänger-Themen 5
R Threads Multithreading Java Basics - Anfänger-Themen 15
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
K Frage bzgl. Multithreading Java Basics - Anfänger-Themen 5
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
C Multithreading, Methoden sichern Java Basics - Anfänger-Themen 5
P Hilfe bei MultiThreading; Einige Fragen. Java Basics - Anfänger-Themen 14
S OOP Multithreading Java Basics - Anfänger-Themen 5
B Multithreading Java Basics - Anfänger-Themen 5
0din Multithreading und stop Java Basics - Anfänger-Themen 5
P Singletons und Multithreading Java Basics - Anfänger-Themen 11
U Anfängerfrage - Multithreading Java Basics - Anfänger-Themen 8
H Multithreading Java Basics - Anfänger-Themen 7
M Multithreading Java Basics - Anfänger-Themen 18
I Multithreading (Prüfungsvorbereitung) Java Basics - Anfänger-Themen 6
G UI friert bei Multithreading ein Java Basics - Anfänger-Themen 3
J Multithreading mit einer TextArea Java Basics - Anfänger-Themen 29
JFeel-x Multithreading in awt Java Basics - Anfänger-Themen 2
Z Multithreading Java Basics - Anfänger-Themen 2
P Multithreading Java Basics - Anfänger-Themen 22
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
H Liste Knoten NullPointerException Java Basics - Anfänger-Themen 7
C Compiler-Fehler NullPointerException Java Basics - Anfänger-Themen 10
LePetitChat1 Arrays - NullPointerException? Java Basics - Anfänger-Themen 14
berserkerdq2 Nullpointerexception, obwohl ich Array initialisiere? Java Basics - Anfänger-Themen 1
U Warum gibt das eine Nullpointerexception? (Switch) Java Basics - Anfänger-Themen 6
missy72 Klassen Objekt Array NullPointerException Java Basics - Anfänger-Themen 3
Jose05 Nullpointerexception Java Basics - Anfänger-Themen 7
emx-zee Erste Schritte NullPointerException, Array mit zufälligen Zahlen füllen Java Basics - Anfänger-Themen 2
Jose05 Nullpointerexception bei Umwandlung von String zu int Java Basics - Anfänger-Themen 2
H Java NullPointerException Java Basics - Anfänger-Themen 4
YaU Vererbung erstellt NullPointerException? Java Basics - Anfänger-Themen 4
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
L Threads Komischer NullPointerException Java Basics - Anfänger-Themen 2
H Fehler: NullPointerException und ich weiß net warum Java Basics - Anfänger-Themen 4
F Fehlermeldung java.lang.NullPointerException Java Basics - Anfänger-Themen 4
Avalon NullPointerException beim Mocken Java Basics - Anfänger-Themen 6
D NullPointerException in foreach loop Java Basics - Anfänger-Themen 1
D java.lang.NullPointerException Java Basics - Anfänger-Themen 19
T Bufferedwriter code Nullpointerexception Java Basics - Anfänger-Themen 4
D NullPointerException im Array Java Basics - Anfänger-Themen 4
X java.lang.NullPointerException fehler ? Java Basics - Anfänger-Themen 1
B java.lang.NullPointerException bei javafx Java Basics - Anfänger-Themen 10
J NullPointerException beim Klonnen eines Arayys und beim aufrufen einer Methode Java Basics - Anfänger-Themen 2
V NullPointerException Java Basics - Anfänger-Themen 2
S NullPointerException während ResultSet Java Basics - Anfänger-Themen 7
V NullPointerException, wenn Key und Value null sind Java Basics - Anfänger-Themen 2
scratchy1 NullPointerException Java Basics - Anfänger-Themen 19
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
F Wie kann ich diese NullPointerException umgehen?! Java Basics - Anfänger-Themen 41
dapzoo Compiler-Fehler Beim Werte verteilen in Objektarray NullPointerException Java Basics - Anfänger-Themen 4
W Optional<T> - NullPointerException Java Basics - Anfänger-Themen 37
Jascha NullPointerException vs NumberFormatException Java Basics - Anfänger-Themen 5
L Variablen NullPointerException bei Dateigröße (Nr.1) Java Basics - Anfänger-Themen 4
M Compiler-Fehler NullPointerException Java Basics - Anfänger-Themen 13
D NullPointerException umgehen Java Basics - Anfänger-Themen 17
Z Objekt Array führt zum NullPointerException Java Basics - Anfänger-Themen 2
W NullPointerException obwohl nicht null? Java Basics - Anfänger-Themen 3
W ArrayList NullPointerException Java Basics - Anfänger-Themen 4
A NullPointerException Java Basics - Anfänger-Themen 6
S NullPointerException Java Basics - Anfänger-Themen 4
T OOP Wörterbuch NullPointerException Java Basics - Anfänger-Themen 4
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
O NullPointerException Java Basics - Anfänger-Themen 2
M Interpreter-Fehler Feld NullPointerException Java Basics - Anfänger-Themen 4
L Variablen Unerklärliche NullPointerException Java Basics - Anfänger-Themen 2
E Compiler-Fehler nullPointerException in verschachteltem Modell Java Basics - Anfänger-Themen 6
DaCrazyJavaExpert Threads NullPointerException Java Basics - Anfänger-Themen 8
DaCrazyJavaExpert Compiler-Fehler Variable nicht mit null initialisiert, trotzdem: NullPointerException Java Basics - Anfänger-Themen 28
kodela NullPointerException Java Basics - Anfänger-Themen 12
R Taschenrechner NullPointerException Java Basics - Anfänger-Themen 1
H java.lang.NullPointerException Java Basics - Anfänger-Themen 4
H NullPointerException obwohl Objekt angelegt wurde Java Basics - Anfänger-Themen 1
A Threads Reentrantlock | NullpointerException möglicher Deadlock? Java Basics - Anfänger-Themen 0
K Compiler-Fehler NullPointerException lösen Java Basics - Anfänger-Themen 16
G java.lang.NullPointerException Java Basics - Anfänger-Themen 3
P Compiler-Fehler NullPointerException Java Basics - Anfänger-Themen 1
E Compiler-Fehler java.lang.NullPointerException Java Basics - Anfänger-Themen 2
S Methoden Methode funktioniert nicht | NullPointerException Java Basics - Anfänger-Themen 6
F NullpointerException bei zweidimensionalem Array Java Basics - Anfänger-Themen 2
Z OOP - Array ständig NullPointerException Java Basics - Anfänger-Themen 4
J Verstehe die NullPointerException nicht Java Basics - Anfänger-Themen 1
T Nullpointerexception und es wird nichts angezeigt Java Basics - Anfänger-Themen 15
H NullPointerException, aber wieso? Java Basics - Anfänger-Themen 5
B ProcessMessage NullPointerException Java Basics - Anfänger-Themen 11
shiroX Compiler-Fehler NullPointerException Java Basics - Anfänger-Themen 9
MrSnake ItemListener mit NullPointerException Java Basics - Anfänger-Themen 3
J java.lang.NullPointerException in meiner JavaFXControllerKlasse Java Basics - Anfänger-Themen 26
M NullPointerException Java Basics - Anfänger-Themen 8
B Vererbung NullPointerException Java Basics - Anfänger-Themen 38
D Communications link failure | java.lang.NullPointerException Java Basics - Anfänger-Themen 3
G NullPointerException Java Basics - Anfänger-Themen 1
J NullpointerException Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben