# Thread beendet sich nicht



## DocTorb (29. Jun 2004)

Hallo!

Ich bin mir nicht ganz sicher, ob ich hier im richtigen Forum bin, aber wenn nicht könnte es ja bitte jemand verschieben.

Also, folgendes Situation.
Ich habe eine Methode die ein Bild filtern soll. Und es soll eine JProgressBar immer anzeigen wieviel Prozent des Bildes bereits bearbeitet wurden.
Dazu habe ich folgendes geschrieben:

```
public BufferedImage blurImage() {
        
        final JFrame frame = new JFrame();
        frame.setTitle("Bearbeitet...");
        frame.setLocationRelativeTo(null);
        JProgressBar bar = new JProgressBar();
        bar.setStringPainted(true);
        frame.getContentPane().add(bar);
        frame.pack();
        frame.setVisible(true);
        
        final JProgressBar pBar = bar;
        
        Thread t = new Thread(){
            int anzahl = 0;
            double max = 100.0/(image.getWidth()*image.getHeight());
            double prozent = 0;
            public void run(){
                for (int x = 0; x < image.getWidth(); x++) {
                    for (int y = 0; y < image.getHeight(); y++) {
                        anzahl++;
                        prozent = (max*anzahl);
                        final double p =  prozent;
                        if (p%10==0){
                            System.out.println((int)prozent+" geschafft");
                            pBar.setValue( (int)p );
                        }
                        // Hier passiert 'ne menge...
                    }
                }
              frame.dispose();  
            };
        };
        t.start();
        System.out.println("Fertig");
        return image;
    }
```

Und jetzt das Problem:
Er arbeitet alles gut durch, filtert das Bild, setzt die Values der ProgressBar, schließt den ProgressBarframe am ende, doch er schreibt das "Fertig" nicht und gibt auch das image nicht zurück.

Müsste sich der Thread nicht nach durchlaufen der ganzen for-Schleifen beenden und es würde dann mit dem System.out.println weitergehen?

wie kann ich das Problem lösen?

PS: Ich finde das Ganze irgendwienicht sehr schön gelöst, wie geht das besser?

Danke für alle Antworten!


----------



## Beni (29. Jun 2004)

Er beendet sich schon, nach der for-Schlaufe. Aber bei _t.start_ teilt sich der Programmfluss. Es müsste eigenlich direkt nach dem Aufruf von _t.start_ "Fertig" ausgegeben werden, und das Bild zurückkommen (obwohl es eigentlich noch gar nicht fertig ist).


Vielleicht benötigst du einen modalen Dialog? Der würde den Programmfluss des Hauptthreads stoppen, solange er sichtbar ist.

```
final JDialog dialog = ...
dialog.setModal( true );
Thread t = new Thread(){
  public void run(){
    ...
    dialog.setVisible( false );
  }
};

t.start();
dialog.setVisible( true );

return image;
```


----------



## Niki (9. Jul 2004)

du kannst dich nach dem starten des threads in den wait-pool legen:, und wenn er im thread fertig ist, weckst du ihn wieder auf, könnte wie folgt aussehen:


```
Thread t = new Thread(){ 
            int anzahl = 0; 
            double max = 100.0/(image.getWidth()*image.getHeight()); 
            double prozent = 0; 
            public void run(){ 
                for (int x = 0; x < image.getWidth(); x++) { 
                    for (int y = 0; y < image.getHeight(); y++) { 
                        anzahl++; 
                        prozent = (max*anzahl); 
                        final double p =  prozent; 
                        if (p%10==0){ 
                            System.out.println((int)prozent+" geschafft"); 
                            pBar.setValue( (int)p ); 
                        } 
                        // Hier passiert 'ne menge... 
                    } 
                } 
              frame.dispose();  
              synchronized([DEINEKLASSE].this){
                this.notifyAll();
              }
            }; 
        }; 
        t.start(); 
        synchronized(this){
            try{
                this.wait();
            }catch(InterruptedException ex){}
        }
        System.out.println("Fertig"); 
        return image;
```


----------



## Beni (9. Jul 2004)

Niki hat gesagt.:
			
		

> du kannst dich nach dem starten des threads in den wait-pool legen:, und wenn er im thread fertig ist, weckst du ihn wieder auf, könnte wie folgt aussehen:



Dann kann man das mit den Threads aber auch gleich ganz weglassen, weil es ja darum geht, den AWT-Thread _nicht_ zu blockieren.


----------



## Niki (9. Jul 2004)

aber was machst du, wenn der Dialog geschlossen wird, dann geht er erst recht wieder raus, ausser der dialog hat defaultcloseoperation auf DO_NOTHING_ und keinen button, auf dem man ihn anderwertig schliessen kann, ist aber nicht sehr schön (meine meinung)


----------



## Beni (9. Jul 2004)

Das ist dann halt die Abbruchbedingung (noch ein WindowListener auf den Dialog backen).
Gibt dem User sogar _mehr _komfort.  :bae:


----------



## Niki (9. Jul 2004)

da hast du recht, muss man halt in der abbruchbedingung vom thread berücksichtigen, sonst rennt der im hintergrund weiter, also, machs mit einem modalen dialog und einer zusätzlichen abbruch bedingung im thread, so dass er sich beendet, wenn das fenster geschlossen wird


----------

