Threads Cannot make a static reference..

Hallo Forum,
ich bin ein learn-by-doing Mensch und habe mir als Lernprogramm eine Art CPU-Benchmarktool überlegt. Folgendes Konzept:

Anzahl der Kerne auslesen, pro kern ein Thread erstellen.
Es wird mit einer Pi-methode dann gerechnet, also genauigkeitswert habe ich Konstant 987.654!
Pro Thread kommt dann noch ein Modifikator vor diese Zahl, abhängig von Kernen. Wird so gerechnet: Modifikator = 24/Anzahl Kerne.
Damit wird theoretisch gleich viel gerechnet, egal bei wie vielen Threads. Doch bevor ich mehrere Thread einrichten kann (verstand ich auch noch nicht ganz), muss es überhaupt mal laufen. (Ohne Threads klappt es natürlich gewollt, nur reizt es eben CPU nicht aus)
Fehlermeldung beim Erstellen eines Threads:

"Cannot make a static reference to the non-static method start() from the type Thread"
Derslebe Fehler kommt, wenn ich eine Funktion aufrufen will, die ein paar Variablen festlegen soll.
Also, folgender Code:

pithread.java
Java:
import java.util.Scanner;

public class pithread {
	public static void main(String[] args)
	{
		//CPU Kerne auslesen
		int cores = Runtime.getRuntime().availableProcessors();
		//Modifikator wird erstellt
		int modi = 24/cores;
		
		//Eingabe einleiten
		Scanner loopobj = new Scanner(System.in);
		System.out.println("Wieviele Loops sollen bearbeitet werden?: ");
		int loops = loopobj.nextInt();
		
		
		//for(int laufend = 0;laufend <= cores; laufend++) {
			
			threadsForPi threadObj = new threadsForPi();
			threadsForPi.setModi(modi, loops);
			
			try {
				threadsForPi.start();
				}
			catch (InterruptedException e) {
		            System.out.println("Thread interrupted");
		        }
		//}	
	}	
}

Und die threadsForPi.java:
Java:
public class threadsForPi extends Thread {
	int genauigkeit = 987654; //Anzahl Brueche fuer PI Berechnung
	int modi; //Modifikator, abhaengig von CPU Kernen
	int loops; //Anzahl der Durchgaenge
	
	@Override
	public void run(){
		
			//Zeitmessung Start
			long start = System.currentTimeMillis();
			
			//loops durchgehen
			for(int counter=1;counter <= loops; counter++) {
				//Pi berechnen
				gebePi(modi*genauigkeit);
			}
			
			//Ausgabe wenn fertig
			long duration = System.currentTimeMillis() - start;
			System.out.println("Kern " + 24/modi + "ist fertig. Dauer: " + duration + " ms");
		
	}
	
	public void setModi(int modi, int loops) {
		this.loops = loops;
		this.modi = modi;
		
	}
	
	public static void gebePi(int i) {
	       //Hier wird Pi mit den paramtern berechnet..
}

Danke für Hilfe!

edit: Fehlermeldung treten in der ersten Datei in Zeile 20 und 23 auf. Der Rest ist problemlos.
 
N

nillehammer

Gast
setModi ist eine Methode, die man auf Instanzen von threadsForPi aufrufen muss. Mit den Konstrukten hier:
Java:
threadsForPi.setModi(modi, loops);
...
threadsForPi.start();
versuchst Du auf dem Klassenobjekt direkt den Aufruf zu machen. Das geht nur mit statischen Methoden. Die Instanz, auf der Du die Aufrufe machen kannst, erzeugst du hier:
Java:
threadsForPi threadObj = new threadsForPi();
D.h. du musst die Methoden auf threadObj aufrufen. Du kannst das direkt aus X5-599's Post kopieren.

P.S. Methoden- und Variablendefinitionen sind schon schön nach Konvention benannt. Gefällt mir. Nun änder noch Deine Klassennamen so, dass sie mit einem Großbuchstaben anfangen. Dann sieht man im Code auch gleich viel schneller, wo man Klassenmethoden aufruft und wo man was mit einer Variablen macht.
 
Zuletzt bearbeitet von einem Moderator:
:oops: facepalm

Wie auch immer, vielen Dank.

Jetzt muss ich allerdings 4 Threads erstellen, und wie das über ein Array geht, verstehe ich noch nicht. Bisher habe ich das so, doch er kann angebliche threadsForPi nicht in threadsForPi[] konvertieren:

Java:
threadsForPi threatObj[] = new threadsForPi();
		
		for(int laufend = 0;laufend <= cores; laufend++) {
			
			/*threadsForPi threadObj = new threadsForPi();
			threadObj.setModi(modi, loops);
			threadObj.start();*/
			
			threadObj[laufend] = new threadsForPi();
			
			
		}

Könnte mir jemand nochmal auf die Sprünge helfen? Das wäre Super!
 
N

nillehammer

Gast
1. es ist besser, die eckigen Klammern hinter den Typ zu schreiben. So sieht man bei der Typdefinition gleich, dass es sich um einen Array handelt.
2. Wenn du eine Array-Variable definierst, dann musst du ihr auch einen Array zuweisen:
Java:
threadsForPi[] threatObj = new threadsForPi[4];
Wie du siehst, musst du bei Initialisierung des Arrays bereits wissen, wieviele Elemente reinpassen sollen. Da du das weißt (4) ist Array hier geeignet. Wenn das nicht bekannt ist, musst du auf Listen ausweichen.
 
Vielen Dank - das ist einleuchtend. Wie groß es sein muss anzugeben, habe ich total vergessen (noch PHP gewöhnt) - und da ich ja ein Thread pro Kern haben möchte, weiß ich vorherrein, wieviele Threads ich brauche.

Noch eine anschließende Frage: Wieso wird mir gesagt, threadObj kann nicht als Variable aufgelöst werden? (Klar, ist ein Array, aber ich habe doch dahinter eckige Klammern?):

Java:
threadsForPi[] threatObj = new threadsForPi[cores];

		
		for(int laufend = 0;laufend < cores; laufend++) {
			
			/*threadsForPi threadObj = new threadsForPi();
			threadObj.setModi(modi, loops);
			threadObj.start();*/
			
			threadObj[laufend].setModi(modi, loops);
			threadObj[laufend].start();
			
		}

Das ist mir schleierhaft. Danke für deine Geduld.
 
Zuletzt bearbeitet:
N

nillehammer

Gast
[EDIT]Quatsch! Es ist ein reiner Schreibfehler (variablenname erst mit t am ende definiert, aber aufruf hat d am ende). Nu fang aber nicht an, uns hier als debugger zu missbrauchen ;)[/EDIT]

In dem kleinen Codeschnipsel ist alles richtig. Ich könnte mir vorstellen, dass du noch mehr Code dazwischen hast und die Variable threadObj in einem anderen Block definierst als der, wo Du sie später verwendest. Genauen Aufschluss würde das Posten des vollständigen Codes inkl. der kopierten Fehlermeldung des Compilers bringen. So ist da leider zu viel Kontext weggefiltert, der für die Fehlersuche wichtig ist.
 
Zuletzt bearbeitet von einem Moderator:
Nochmal editiert:
Also, hab noch tray catch eingebaut, und nunja, jetzt ensteht eben immer der Fehler. Mit einem Thread gehts, mit mehreren kommt eben der Output, dass ein Fehler aufgetreten sei. Im Code selbst sind natürlich keine Fehler mehr. habe auch die java Datei aktualisiert.
Wie debuggt man ab jetzt denn?

und hier meine pithread.java:

Java:
import java.util.Scanner;

public class pithread {
	public static void main(String[] args) throws InterruptedException
	{
		//CPU Kerne auslesen
		int cores = Runtime.getRuntime().availableProcessors();
		//Modifikator wird erstellt
		int modi = 24/cores;
		
		//Eingabe einleiten
		Scanner loopobj = new Scanner(System.in);
		System.out.println("Wieviele Loops sollen bearbeitet werden?: ");
		int loops = loopobj.nextInt();
		
		threadsForPi[] threatObj = new threadsForPi[cores];

		
		for(int laufend = 0;laufend < cores; laufend++) {
			
			/*threadsForPi threadObj = new threadsForPi();
			threadObj.setModi(modi, loops);
			threadObj.start();*/
			try {
				threatObj[laufend].setModi(modi, loops, laufend);
				threatObj[laufend].start();
			} catch (Exception e) {
				 System.out.println("Da ist wohl ein Fehler aufgetreten");
			}
		}
	}	
}

Meine threadsForPi.java:

Java:
public class threadsForPi extends Thread {
	int genauigkeit = 987654; //Anzahl Brueche fuer PI Berechnung
	int modi; //Modifikator, abhaengig von CPU Kernen
	int loops; //Anzahl der Durchgaenge
	
	@Override
	public void run(){
		
			//Zeitmessung Start
			long start = System.currentTimeMillis();
			
			//loops durchgehen
			for(int counter=1;counter <= loops; counter++) {
				//Pi berechnen
				gebePi(modi*genauigkeit);
			}
			
			//Ausgabe wenn fertig
			long duration = System.currentTimeMillis() - start;
			System.out.println("Kern " + 24/modi + " ist fertig. Dauer: " + duration + " ms");
		
	}
	
	public void setModi(int modi, int loops) {
		this.loops = loops;
		this.modi = modi;
		
	}
	
	public static void gebePi(int i) {
	      //PI berechnen 
	       }
}

Mehr ist nicht da..

edit: Kommando zurück, thread statt threat getippt :eek: Eben fix testen.

Schau nochmal oben, hab was am Posting geändert!
 
Zuletzt bearbeitet:
Nochmal editiert:
Also, hab noch tray catch eingebaut, und nunja, jetzt ensteht eben immer der Fehler. Mit einem Thread gehts, mit mehreren kommt eben der Output, dass ein Fehler aufgetreten sei. Im Code selbst sind natürlich keine Fehler mehr. habe auch die java Datei aktualisiert.
Wie debuggt man ab jetzt denn?

und hier meine pithread.java:

Java:
import java.util.Scanner;

public class pithread {
	public static void main(String[] args) throws InterruptedException
	{
		//CPU Kerne auslesen
		int cores = Runtime.getRuntime().availableProcessors();
		//Modifikator wird erstellt
		int modi = 24/cores;
		
		//Eingabe einleiten
		Scanner loopobj = new Scanner(System.in);
		System.out.println("Wieviele Loops sollen bearbeitet werden?: ");
		int loops = loopobj.nextInt();
		
		threadsForPi[] threatObj = new threadsForPi[cores];

		
		for(int laufend = 0;laufend < cores; laufend++) {
			
			/*threadsForPi threadObj = new threadsForPi();
			threadObj.setModi(modi, loops);
			threadObj.start();*/
			try {
				threatObj[laufend].setModi(modi, loops, laufend);
				threatObj[laufend].start();
			} catch (Exception e) {
				 System.out.println("Da ist wohl ein Fehler aufgetreten");
			}
		}
	}	
}

Meine threadsForPi.java:

Java:
public class threadsForPi extends Thread {
	int genauigkeit = 987654; //Anzahl Brueche fuer PI Berechnung
	int modi; //Modifikator, abhaengig von CPU Kernen
	int loops; //Anzahl der Durchgaenge
	
	@Override
	public void run(){
		
			//Zeitmessung Start
			long start = System.currentTimeMillis();
			
			//loops durchgehen
			for(int counter=1;counter <= loops; counter++) {
				//Pi berechnen
				gebePi(modi*genauigkeit);
			}
			
			//Ausgabe wenn fertig
			long duration = System.currentTimeMillis() - start;
			System.out.println("Kern " + 24/modi + " ist fertig. Dauer: " + duration + " ms");
		
	}
	
	public void setModi(int modi, int loops) {
		this.loops = loops;
		this.modi = modi;
		
	}
	
	public static void gebePi(int i) {
	      //PI berechnen 
	       }
}

Mehr ist nicht da..

edit: Kommando zurück, thread statt threat getippt :eek: Eben fix testen.

Schau nochmal oben, hab was am Posting geändert!

Ja, dashabe ich auch gemerkt, kurz nach dem Post :D Was ich mit den Exceptions anfangen soll, keine Ahnung. Nichtmal Google möchte mir helfen, bei Galileo Computing fand ich auch nichts. Gibt es dazu keine Dokumentation?:rtfm:
 
N

nillehammer

Gast
wernersbacher hat gesagt.:
Ja, dashabe ich auch gemerkt, kurz nach dem Post Was ich mit den Exceptions anfangen soll, keine Ahnung. Nichtmal Google möchte mir helfen, bei Galileo Computing fand ich auch nichts. Gibt es dazu keine Dokumentation?
Wenn ich von Dir lese, dass du im Internet nichst brauchbares zum Thema Exceptions gefunden hast, dann lässt das für mich nur den Schluss zu: "zu faul zu suchen/zu lesen" Das dann "Ich bin Leraning-By-Doing Mensch" zu nennen, ist eine Beschönigung. Mag sein, dass Das für Dich dann gut aussieht, aber Du wirst damit scheitern. Mach also vielleicht doch mal einen Schritt zurück und hangel Dich durch Tutorials zum Erlernen der Grundlagen, z.B. dem hier: The Java™ Tutorials Der Teil, der sich speziell mit Exceptions beschäftigt, ist hier zu finden: Lesson: Exceptions (The Java™ Tutorials > Essential Classes)
 
B

BlaBlub

Gast
Wenn du noch kein Plan hast, dann lass das e.printStackTree bei Exception bitte nicht weg, generell mach es garnicht immerhin ist das einer der Java "Features" wo du ganz einfach sehen kannst was und wie und wo falsch gelaufen ist beim ausführen, mit der Fehlermeldung kannst du 98% den Code direkt nach Lesen des Fehlers fixen, sollte man sich also immer ausgeben lassen.
 

X5-599

Top Contributor
So bin auch wieder da :)

Ich stimme da meinen Vorrednern zu. Exception Handling solltest du dir auf jeden Fall mal ansehen.

Zu deinem Problem: Also ich vermute eine NullPointerException, da du zwar das Array erstellst aber dieses nicht mit Objekten füllst.

Java:
threadsForPi[] threatObj = new threadsForPi[cores]; //Leeres Array. Jedes Feld darin ist noch "null"
 
        
        for(int laufend = 0;laufend < cores; laufend++) {
            
            try {
                threadObj[laufend] = new threadsForPi(); //Hier wird das Objekt erzeugt und ins Array gelegt. Keine NullPointerException mehr.
                threatObj[laufend].setModi(modi, loops, laufend);
                threatObj[laufend].start();
            } catch (Exception e) {
                 System.out.println("Da ist wohl ein Fehler aufgetreten");
                 e.printStackTrace(); // Das hätte dir die NullPointerException (tatsächlich den ganzen Stacktrace) in der Konsole ausgegeben
            }
        }
 
Zuletzt bearbeitet:

FArt

Top Contributor
Sorry, das ist nicht "learning by doing" sondern "too lazy for reading" und "asking for nothing". Es ist ein großer Fehler mit Kenntnissen aus einer Sprache wie PHP zu kommen und sein Verhalten bzgl. programmieren einfach zu adaptieren.

Kümmer dich erst mal um Objektorientierung und wichtige Konstrukte in Java, Fehlerbehandlung und Logging usw. Danach kannst du dich an Threading wagen. So macht das keinen Sinn.

Stelle Fragen dieser Art im Anfängerforum. Du hast zwar ein vermeintliches Fortgeschrittenenthema gewählt, diese "Probleme" gehören hier aber nicht hin.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
conan2 "Cannot make a static reference to the non-static field Allgemeine Java-Themen 8
A Variablen non-static variable cannot be referenced from a static content Allgemeine Java-Themen 4
Erwin82a Object cannot be converted to Custom Class in Lampda Expression Allgemeine Java-Themen 2
B Type mismatch: cannot convert from Graph.Edge to ArrayList<Graph.Edge> Allgemeine Java-Themen 21
D Selenium - cannot find Chrome binary Allgemeine Java-Themen 6
bueseb84 Java : Cannot find Symbol Allgemeine Java-Themen 7
S class path resource [config.properties}] cannot be opened because it does not exist Allgemeine Java-Themen 4
C Compiler-Fehler Cannot find symbol bei Hat-Beziehungen Allgemeine Java-Themen 5
Tarrew RMI Java RMI - com.sun.proxy.$Proxy1 cannot be cast to Funktionen Allgemeine Java-Themen 0
A Eclipse - Fehler beim "RUN" - "Unable to Launch - The selection cannot be launched" Allgemeine Java-Themen 6
R Char cannot be derefenrenced? Allgemeine Java-Themen 14
M Cannot create a generic array of T Allgemeine Java-Themen 5
127.0.0.1 Methodenaufruf -cannot find symbol- Allgemeine Java-Themen 14
S Type mismatch: cannot convert from Object to float Allgemeine Java-Themen 3
B Cannot find main-claas... Allgemeine Java-Themen 21
P Default constructor cannot handle exception type Allgemeine Java-Themen 6
M cannot be cast to java.lang.Comparable Allgemeine Java-Themen 5
K + cannot be applied Allgemeine Java-Themen 15
Tobse Cannot find symbol : construktor --- Deklariert! Allgemeine Java-Themen 9
D 'InputStreamReader' & 'BufferedReader' führen zu "cannot find symbol"-Fehler Allgemeine Java-Themen 3
X Cannot refer to a non-final variable settings inside an inner class defined in a different method Allgemeine Java-Themen 4
B cannot find Symbol Allgemeine Java-Themen 2
K java.io.IOException: Cannot validate certificate for jogl.dll Allgemeine Java-Themen 6
Saxony assert cannot be resolved Allgemeine Java-Themen 5
? Cannot run program + Vista Allgemeine Java-Themen 8
X cannot convert from Object[] to Integer[] Allgemeine Java-Themen 2
B aus java heraus kompillierte Klassen - cannot be resolved Allgemeine Java-Themen 3
G [quote]the type HashMap is not generic; it cannot be paramet Allgemeine Java-Themen 4
R cannot be referenced! Allgemeine Java-Themen 18
R Cannot be referenced. Allgemeine Java-Themen 7
G Kompiler Fehler: cannot resolve symbol: class Allgemeine Java-Themen 4
7 Cannot resolve Symbol keyPressed Allgemeine Java-Themen 3
A Fehlermeldung: cannot be resolved Allgemeine Java-Themen 5
G warum operator || cannot be applied to int, double Allgemeine Java-Themen 11
D Probleme mit 'cannot execute runjava.bat' Allgemeine Java-Themen 2
G Fehlermeldung "cannot resolve symbol" Allgemeine Java-Themen 7
V Cannot resolve symbol Allgemeine Java-Themen 7
E Methoden abstract static Methode Allgemeine Java-Themen 8
N nicht static und auch nicht new Allgemeine Java-Themen 3
P static Blocks und variablen Allgemeine Java-Themen 41
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
P Static Variable -> unterschiedliche Werte? Allgemeine Java-Themen 1
K Static Variablen verbieten Allgemeine Java-Themen 10
C Generic collections und static typing Allgemeine Java-Themen 4
M Warum nicht static ? Allgemeine Java-Themen 10
M Eine static-Methode verlassen Allgemeine Java-Themen 2
B Schlüsselworte [ERLEDIGT] static { } - Was ist das und wofür kann ich das brauchen? Allgemeine Java-Themen 1
J private static final String variable Allgemeine Java-Themen 8
L Non-static-Variables in Enumerationen Allgemeine Java-Themen 2
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
T Enumeration/Static Final/Bitfield Allgemeine Java-Themen 6
T Static kann nicht verändert werden Allgemeine Java-Themen 3
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
N Static oder andere Lösung Allgemeine Java-Themen 5
N Vererbung Static & private fields - Nicht ganz einfach? Allgemeine Java-Themen 4
M Wo hin mit static factory methods? Allgemeine Java-Themen 40
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
K Static - Problem Allgemeine Java-Themen 10
M Variablen Variablenzugriff aus static void Allgemeine Java-Themen 21
D API - Beispiel + static member in inner (non static) class Allgemeine Java-Themen 2
S static methoden Allgemeine Java-Themen 9
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
X HTTP Problem mit static/non static JTextArea Update Allgemeine Java-Themen 17
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
B static Variable / Unterklasse Allgemeine Java-Themen 2
I Was macht static { ... } ? Allgemeine Java-Themen 8
G static inner Klassen Allgemeine Java-Themen 7
G static und dynamic linking? Allgemeine Java-Themen 32
J in einer static Variable Wert ändern Allgemeine Java-Themen 6
J Verständnisfrage - nested static classes Allgemeine Java-Themen 11
G static- Methoden überschreiben Allgemeine Java-Themen 10
E Geschwindigkeit static Allgemeine Java-Themen 6
V Static oder wie? Allgemeine Java-Themen 61
I reflection get inner static classes Allgemeine Java-Themen 2
L static main - Spezifikation? Allgemeine Java-Themen 7
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
D static Allgemeine Java-Themen 46
P static-Methode aus dem Konstruktor aufrufen Allgemeine Java-Themen 6
oliver1974 "(.) should be accessed in a static way" Falsche W Allgemeine Java-Themen 6
P static Klassenvariable Allgemeine Java-Themen 15
B JPasswordField klassenübergreifend auslesen->static Probl Allgemeine Java-Themen 4
F Methoden: static vs. instance Allgemeine Java-Themen 24
MQue static Methoden/Klassen Allgemeine Java-Themen 7
K Warum static-Methoden nutzen Allgemeine Java-Themen 26
G Java-Befehle Native und Static Allgemeine Java-Themen 2
conan2 static-Block in Klassen Allgemeine Java-Themen 6
M JNI, static.a mit load.Library laden? Allgemeine Java-Themen 2
K Static Members von Superklasse für JEDEN Erben Allgemeine Java-Themen 6
padde479 The static method sleep(long) from the type Thread should. Allgemeine Java-Themen 2
M static-Methode vorschreiben Allgemeine Java-Themen 5
S singleton vs. static Allgemeine Java-Themen 7
G Object mit static Feldern speichern Allgemeine Java-Themen 9
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben