# java Thread java.lang.OutOfMemoryError: Java heap space



## joerg1978 (8. Jan 2007)

Hallo

habe seit einiger Zeit ein Problem.  Um die Ergebnismege (result) auszugeben,möchte ich warten bis der Thread beendet ist. (also mit .joint()) Leider erhalte ich eine Fehlermeldung:

Exception in thread "Thread-2" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

Kommentiere ich join() aus, wie der untenstehende Code funktioniert der Thread einwandfrei? Kann jemand von Euch helfen?

Vielen Dank

Gruß Joerg

Eine Thread wird gestartet und es soll auf die Ergebnissmenge 




```
package progress;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JProgressBarDemo extends JFrame {
	static JProgressBar bar = new JProgressBar(0, 1000000);

	int dummy = 0;

	public JProgressBarDemo() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JButton but = new JButton("Start zählen");
		but.addActionListener(new ButtonActionListener());
		add(bar, BorderLayout.PAGE_START);
		add(but, BorderLayout.PAGE_END);
		pack();
	}

	class testThread implements Runnable {
		public int result;

		public void run() {
			result = 8;
			for (int i = 1; i <= bar.getMaximum(); ++i) {
				final int j = i;
				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						bar.setValue(j);
						dummy = 1;
					}
				});
			}
		}

	}

	private class ButtonActionListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			testThread t = new testThread();
			Thread a = new Thread(t);
			a.start();
//			 try {
//           a.join();
//			 } catch (InterruptedException e1) {
//			 // TODO Auto-generated catch block
//			 e1.printStackTrace();
//			 }
			 System.out.println(t.result);

		}
	}

	public static void main(String[] args) {
		new JProgressBarDemo().setVisible(true);
	}
}
```


----------



## Wildcard (8. Jan 2007)

Du darfst in keinem Fall den EventDispatcher-Thread lahm legen.


----------



## joerg1978 (9. Jan 2007)

Wildcard hat gesagt.:
			
		

> Du darfst in keinem Fall den EventDispatcher-Thread lahm legen.


Hallo,

erstmal vielen Dank, ja irgendwie scheint es so als ob ich mit dem join() den nebenläufigen anderen Thread der mit invokeLater automatisch gestartet wird blockiere. Nur wie komme ich da wieder raus?? Habe bisher noch keine Lösung gefunden???


----------



## Wildcard (9. Jan 2007)

Ganz einfach: Da darf in keinem Fall ein join stehen. Nicht im EDT.


----------



## joerg1978 (9. Jan 2007)

Wildcard hat gesagt.:
			
		

> Ganz einfach: Da darf in keinem Fall ein join stehen. Nicht im EDT.



Hallo,

danke Wildcard für Deine Antworten. Ist es aber nicht so, dass ich im Listener einen neuen Thread (a) starte und somit auf das Ende von diesem Thread warte? Wird damit auch der EDT gestoppt? Wie würdest du den Code umschreiben und das angestrebte Ziel zu erreichen?


Gruß joerg1978


----------



## Wildcard (9. Jan 2007)

Der Listener wird vom EDT ausgeführt. Wenn du dort also auf einen Thread wartest blockiert der gesamte EDT.
Ich weiß nicht genau was du machen willst, also kann ich dir nicht sagen wie du's implementieren sollst.


----------



## Leroy42 (9. Jan 2007)

joerg1978 hat gesagt.:
			
		

> Um die Ergebnismege (result) auszugeben,möchte ich warten bis der Thread beendet ist.



Du mußt entweder die Ausgabe in den Thread verlegen,
oder am Ende der run-Methode des Threads eine
Methode deiner Klasse aufrufen, die dann die Ausgabe übernimt


----------



## Guest (9. Jan 2007)

Leroy42 hat gesagt.:
			
		

> joerg1978 hat gesagt.:
> 
> 
> 
> ...



Danke Ihr beiden, hab die Sache soweit gefixt das es läuft... werde mir die Sache nochmal übers We durch den Kopf gehen lassen mit den Threads...

Gruß Joerg1978


----------

