meinThread.wait(); wirft immer Exeption & hat kein Effekt

T_Wolf

Mitglied
Hi also ich habe einen Thread, und eine GUI in der ich in Buttons den Thread starte und warten lassen will und wieder anwerfen. Allerdings ist der thread weder zu stoppen noch schlafenzulegen.

Wenn ich selbst einen Boolean erstelle welcher wenn true intern .stop() aufruft klappt es aber warum kann ich wait() stop() notify() nicht von außen aufrufen .... Was habe ich da nicht verstanden ?



Thread :
Java:
	public void run (){
		
		for (int i=0;i<irgendwann;i++){
			this.machezeug();
			if (kontrolliertesBeenden)this.stop();  // Teil der funktionierenden Lösung
		    try
		    {
		    	Thread.sleep(100);
		    }
		    catch (InterruptedException ie)
		    {
		        System.out.println("Exeption beim schlafen!");
		    }
		}
	}

Buttons (dooferThread ist ausserhalb erstellt) :
Java:
        startSim = new JButton("Simulation starten");
        getContentPane().add(startSim);

        startSim.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
        		dooferThread.start();
            }
        });
        
        anhalten = new JButton("Simulation anhalten");
        anhalten.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
            	refresher.cancel(true); 
        		try {
                	fermenterThread.kontrolliertesBeenden=true;  // Das funktioniert ist aber sicherlich nicht so gedacht das man sich die Methoden selbst reinhauen muss zum abbrechen
                	dooferThread.wait();
        		} catch (Exception ignore) {
        			System.out.println("Fehler, dies könnte ein Fehler sein.");
        		}
            }
        });
 
B

Beni

Gast
Und "Thread.stop" sollte man nicht aufrufen. Das ist eine uralte Methode die üble Nebeneffekte hat. Es ist besser einfach die run-Methode zu verlassen, dann beendet sich der Thread von alleine.
 

T_Wolf

Mitglied
Wird eine [c]IllegalMonitorStateException[/c] geworfen? Kann gut sein, denn:

Ja genau die wird geworfen.
Aber benötige doch 2 Buttons um die zu kontrollieren eine zum starten und einen zum abbrechen. und deklariert habe ich das Ding ausserhalb (wie es bei Variablen bisher immer geklappt hat.
oder was muss ich hier anders machen ?

@ Michael ... es gibt keine gemeinsamen Objekte ... der Thread erstellt nur Daten welche in ner Datenbank gespeichert werden -> die gui greift nur auf die Daten der Datenbank zurück

@Beni
Quasi ist das stop bisher nur platzhalter für die Methode die ich dann nutzen werde, allerdings hat keine funktioniert.
.cancel() wäre die "neuere" variante oder ?
 
S

SlaterB

Gast
wait() ist nicht einfach eine Thread-Methode wie start() oder stop() (ungeachtet ob letzte überhaupt funktioniert),
sondern eine der wenigen Methoden die von Object geerbt werden,

den Einsatz von wait und notify muss man erst lernen, hat mit Synchronisation zu tun
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 11.6 Synchronisation über Warten und Benachrichtigen
besonders
> 11.6.3 Warten mit wait() und Aufwecken mit notify()

am besten natürlich das ganze Kapitel 11 von Anfang an lesen und noch 'am besteren' die vorherigen kennen ;)
 
G

Gastredner

Gast
Quasi ist das stop bisher nur platzhalter für die Methode die ich dann nutzen werde, allerdings hat keine funktioniert.
.cancel() wäre die "neuere" variante oder ?
Nein. Stattdessen konstruiert man die run()-Methode des Threads so, dass sie sich irgendwann alleine beendet, also sozusagen ausläuft. Der Thread beendet sich nach Auslaufen der Methode dann von selbst.

(Unsinniges) Beispiel:
Java:
public class SelfEndingThread {

	public static void main(String[] args) {
		Runnable runnable = new Runnable() {
			
			public void run() {
				for (int i=0; i<=10; i++) {
					System.out.println(i);
				}
				// Es folgt keine weitere Anweisung - die Methode beendet
				// sich. Der Thread wird ihr dann automatisch folgen.
			}
		}
		new Thread(runnable).start();
	}
}
 

T_Wolf

Mitglied
@ Faetzeminator

So etwas habe ich ja Quasi mit dem Bool "kontrolliertesbeenden" getan, die .stop wird im thread zu einem Zeitpunkt aufgerufen wo nichts kaputtgehen kann.

@ Slater
werde ich dan mal lesen und verstehen müssen ;)

@Gastredner

Allerdings kostet es doch enormen Rechenaufwand jeden durchlauf ein neuen Thread zu erstellen (der Thread an sich hat einiges an Variablen & Methoden
 

Michael...

Top Contributor
Allerdings kostet es doch enormen Rechenaufwand jeden durchlauf ein neuen Thread zu erstellen (der Thread an sich hat einiges an Variablen & Methoden
Wäre aber eine einfach umzusetzende Möglichkeit - und Rechenaufwand wird oft überschätzt.

Mit wait() und notify() könnte man den Thread anhalten. Allerdings muss das - wie gesagt - an einem gemeinsamen Objekt aufgerufen werden. Wenn's kein sinnvolles gemeinsames Objekt gibt könnte man sich eines zu diesem Zweck eines erzeugen.
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
also wenn der Thread selber kein gemeinsames Objekt ist (zwischen Thread und seinem Herren), was denn dann? ;)
 

Michael...

Top Contributor
;-) Kann man durchaus machen - fände ich allerdings nicht so schön, zumal der Thread ja auf etwas warten soll und nicht etwas auf den Thread.
 

Michael...

Top Contributor
Das wait() muss innerhalb der run-Methode aufgerufen werden, den schließlich soll diese ja pausieren.
hier mal ein auf die Schnelle zusammengeschustertes Bsp.:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class AnimationWait extends JFrame {
	public static void main(String[] args) {
		new AnimationWait();
	}

	private JButton start, stop;
	private AnimationPanel aniPanel;

	public AnimationWait() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(0, 0, 200, 200);
		this.setLocationRelativeTo(null);
		this.getContentPane().add(aniPanel = new AnimationPanel(),
				BorderLayout.CENTER);
		JPanel panel = new JPanel(new GridLayout(1, 2));
		panel.add(start = new JButton("Start"));
		panel.add(stop = new JButton("Stop"));
		this.getContentPane().add(panel, BorderLayout.SOUTH);
		this.setVisible(true);
		
		new Thread(new AnimationThread(aniPanel)).start();
		
		start.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				aniPanel.setActive(true);
			}
		});
		
		stop.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				aniPanel.setActive(false);
			}
		});
	}

	class AnimationPanel extends JPanel {
		private Color[] color = new Color[] { Color.RED, Color.BLUE, Color.ORANGE };
		private int colorIndex = 0;
		private boolean active = false;

		public void increaseIndex() {
			colorIndex++;
			this.repaint();
		}
		
		public synchronized void setActive(boolean b) {
			this.active = b;
			this.notifyAll();
		}
		
		public synchronized boolean isActive() {
			return active;
		}

		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(color[colorIndex % color.length]);
			int w = this.getWidth(), h = this.getHeight();
			g.fillRect((w - 50) / 2, (h - 50) / 2, 50, 50);
		}
	}

	class AnimationThread implements Runnable {
		private AnimationPanel panel;
		public AnimationThread(AnimationPanel panel) {
			this.panel = panel;
		}
		
		public void run() {
			while (true) {
				if (panel.isActive())
					panel.increaseIndex();
				else
					try {
						synchronized(panel) {
							panel.wait();
						}
					} catch (InterruptedException exc) {
						exc.printStackTrace();
					}
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
Auf entsprechende Literatur wurde ja schon hingewiesen.
 
S

SlaterB

Gast
Ja aber wenn es auf dem Thread ausgeführt werden kann müsste
Thread.wait();
Doch funktionieren.
Und warum hat der Programmteil der den Thread startet keine Zugriffsrechte auf den Thread ?

wie gesagt: völlig am Sinn von Synchronisation allgemein und wait()-Methode im besonderen vorbei,
einfache deutliche Beispiele und Erklärungen im Lehrbuch lesen oder die freundlicherweise hier eintippten Kopien davon
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Exception bei Button mit wait() und notifyAll() Java Basics - Anfänger-Themen 3
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
M notify und wait Java Basics - Anfänger-Themen 1
M Threads synchronized und wait Java Basics - Anfänger-Themen 2
D Stack-Objekt - LIFO - wait(); notify(); Java Basics - Anfänger-Themen 0
D Probleme mit wait(), notify() Java Basics - Anfänger-Themen 0
M wait/notify bei Socket Java Basics - Anfänger-Themen 4
BlueFox Greenfoot wait() Java Basics - Anfänger-Themen 10
Luk10 Monitor: wait() und notify() Java Basics - Anfänger-Themen 8
A wait() problem Java Basics - Anfänger-Themen 3
G wait()-Mehtode Java Basics - Anfänger-Themen 13
S Threads: wait() und notify() Java Basics - Anfänger-Themen 11
S bin zu blöd für threads - wait, notify, synchronized Java Basics - Anfänger-Themen 11
R wait() in synchronized - Block oder nicht? Java Basics - Anfänger-Themen 4
B Problem: wait() -> notify() Java Basics - Anfänger-Themen 4
M Threads, wait() und notify() Java Basics - Anfänger-Themen 10
G Threads steuern mit wait und notify Java Basics - Anfänger-Themen 2
M wait() sleep() geht nicht wirklich Java Basics - Anfänger-Themen 3
P wait und notify oder wie soll ich es lösen Java Basics - Anfänger-Themen 2
vogella *Gelöst *Im Programm warten (wait()) Java Basics - Anfänger-Themen 2
D Wait und Image Java Basics - Anfänger-Themen 3
U wait Java Basics - Anfänger-Themen 2
O Problem bei der Synchronisierung von Threads (wait&notif Java Basics - Anfänger-Themen 4
C java.util.Timer und wait() oder so was Java Basics - Anfänger-Themen 3
Dimax BufferedReader.readLine().length() wirft NullPointer Java Basics - Anfänger-Themen 6
R Methoden ArrayList clonen wirft exception Java Basics - Anfänger-Themen 3
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
F Ausdruck wirft unerwarteten Error Java Basics - Anfänger-Themen 2
I Datentypen input.nextCharAt(0) wirft einen Fehler Java Basics - Anfänger-Themen 3
E InputStream im Servlet wirft Exception Java Basics - Anfänger-Themen 5
J Zwei Arrays zippen wirft eine ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 11
S Datentypen List.toString wirft NullPointerException Java Basics - Anfänger-Themen 5
L Boolean Methode wirft Fehler aus Java Basics - Anfänger-Themen 12
R indexOf wirft NullPointer Exception Java Basics - Anfänger-Themen 2
Kenan89 XML-Files erstellen wirft File not found Exception Java Basics - Anfänger-Themen 9
B Files.copy wirft Exeption Java Basics - Anfänger-Themen 2
S XML wirft Ecxeption Java Basics - Anfänger-Themen 2
G Package in JBuilder einbinden wirft tausende Fehler aus Java Basics - Anfänger-Themen 15
J Double.parseDouble(s) wirft keine NumberFormatException Java Basics - Anfänger-Themen 12
S JTextField.setText("hallo") wirft exception. Java Basics - Anfänger-Themen 3
D StringTokenizer wirft Exception Java Basics - Anfänger-Themen 9
U super-Konstruktor Aufrufen mit Object, dass Exception wirft Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben