ThreadPool sicher beenden unter Verwendung von swt.widgets.Display.syncExec

Twiggy

Neues Mitglied
Hallo,

beim schließen des Displays bleiben die ThreadPool-Threads immer im syncExec Aufruf hängen und lassen sich nicht mehr beenden. Auch der Aufruf von shutdownNow führt nicht zum Erfolg. Hat vielleicht jemand eine Idee für eine saubere Lösung?


Java:
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;


public class GUI implements Runnable {  
  private final ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor( 20 );
  private final Display display = new Display();
  private final Shell shell = new Shell( display );
	
  public static void main( String[] args ) {
     new GUI().run();
  }
  
  public void run() {		
    shell.addDisposeListener( new DisposeListener() {
      public void widgetDisposed( DisposeEvent disposeEvent ) {
        System.out.println( "Shutdown..." );
        scheduler.shutdown();
        try {
          while( !scheduler.awaitTermination( 1000, TimeUnit.MILLISECONDS ) ) {
             System.out.println( "Shutdown now!" );
             scheduler.shutdownNow();
           }
         }catch( InterruptedException e ) {
             System.out.println( e ); 
         }
       }
     });
     shell.open();

     for( int i = 0; i < 20; i++ ) {
       scheduler.scheduleAtFixedRate( new DoSomething(), (int)(Math.random() * 1000), 1000, TimeUnit.MILLISECONDS );
     }
     while( !shell.isDisposed() ) {
       if( !display.readAndDispatch() ) {
         display.sleep();
       }
     }
     display.dispose();
  }
	
  private void drawshit() {
    if( !shell.isDisposed() ) {
      GC gc = new GC( shell );
      for( int i = 0; i < 1000; i++ ) {
        Font font = new Font( gc.getDevice(), new FontData("Calibri", (int) (Math.random() * 30), SWT.NORMAL) );
        gc.setFont(font);
        gc.drawText( "Hello World", (int) (Math.random() * shell.getSize().x), (int) (Math.random() * shell.getSize().x));
        font.dispose();
      }
      gc.dispose();
    }
  }

  private class DoSomething implements Runnable {
    public void run() {
      display.syncExec( new Runnable()	{
        public void run() {
          drawshit();
        }
      });
    try { Thread.sleep( 500 ); } catch( InterruptedException e ) {e.printStackTrace();}
    display.syncExec( new Runnable() {
        public void run() {
          drawshit();
        }
      });
    }
  }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
_user_q ThreadPool schedule Wert auf false setzen AWT, Swing, JavaFX & SWT 1
S JFrame sicher öffnen AWT, Swing, JavaFX & SWT 9
L Postleitzahlen für die nächsten 5 Millionen Jahre sicher AWT, Swing, JavaFX & SWT 11
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
N JavaFX Vor beenden der Anwendung durch klicken von X Dialog zeigen AWT, Swing, JavaFX & SWT 1
S Swing Alles beenden bei Fenster mit Scroll-Balken AWT, Swing, JavaFX & SWT 6
D JafaFX Anwendung beenden AWT, Swing, JavaFX & SWT 11
S Action durchführen beim Programm beenden AWT, Swing, JavaFX & SWT 3
S Event Handling konsole Programm mit Tastendruck beenden AWT, Swing, JavaFX & SWT 5
I Swing Menu->Beenden AWT, Swing, JavaFX & SWT 6
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
J Button soll nach Klick Text ändern und Programm in 3 Sekunden beenden AWT, Swing, JavaFX & SWT 6
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
J Schließen über x soll zwei Prozesse beenden AWT, Swing, JavaFX & SWT 7
1 CellEditor mit ComboBox richtig beenden AWT, Swing, JavaFX & SWT 4
P Vor Beenden änderungen prüfen AWT, Swing, JavaFX & SWT 2
R Endlosschleife auf JButton druck beenden AWT, Swing, JavaFX & SWT 9
S AWT Fenster schließen und Programm beenden AWT, Swing, JavaFX & SWT 10
F Swing Beenden eines ActionListener über einen Button AWT, Swing, JavaFX & SWT 8
E Swing CellEditor bei Fokusverlust Bearbeitung beenden?! AWT, Swing, JavaFX & SWT 6
J Java-Applet beenden AWT, Swing, JavaFX & SWT 3
T Java Applet beenden AWT, Swing, JavaFX & SWT 2
S Gridlayout - Tabellenzeile "beenden" AWT, Swing, JavaFX & SWT 3
P Mouse Listener beenden AWT, Swing, JavaFX & SWT 14
E windowClosing() - JFrame nicht durch X knopf gleich beenden? AWT, Swing, JavaFX & SWT 9
M Programm beenden AWT, Swing, JavaFX & SWT 10
S Thread beenden, wenn Component nicht mehr benötigt wird AWT, Swing, JavaFX & SWT 12
J Fenster schließen ohne das Programm zu beenden AWT, Swing, JavaFX & SWT 3
G java.awt Vollbild beenden AWT, Swing, JavaFX & SWT 6
M JTable: TableCellEditor nach Eingabe sofort beenden? AWT, Swing, JavaFX & SWT 3
T DIALOG für BEENDEN AWT, Swing, JavaFX & SWT 11
R Beenden Dialog beim Schließen AWT, Swing, JavaFX & SWT 2
S Bei SWT den Windows beenden Button manipulieren? AWT, Swing, JavaFX & SWT 4
U Anwendung nicht beenden beim form schliessen? AWT, Swing, JavaFX & SWT 6
M KeyEvent - Programm mit ESC beenden AWT, Swing, JavaFX & SWT 7
G "Alte" Instanzen beenden AWT, Swing, JavaFX & SWT 2
S Anwendung über Button beenden? AWT, Swing, JavaFX & SWT 4
N Beenden-Dialog mit "Beenden" und "Abbrechen&q AWT, Swing, JavaFX & SWT 2
V Zweimal klicken um Modalen Dialog zu beenden? AWT, Swing, JavaFX & SWT 15
S JPopupMenu - Kontrolliert beenden AWT, Swing, JavaFX & SWT 3
G MouseEvent beenden AWT, Swing, JavaFX & SWT 17
B JOptionDialog mit Enter Beenden? AWT, Swing, JavaFX & SWT 5
L JOP.showInputDialog: Abbrechen Button-Funktion beenden AWT, Swing, JavaFX & SWT 5
X Fenster schließen aber nicht beenden AWT, Swing, JavaFX & SWT 9
S "Millionen" von Threads? Programm komplett beenden AWT, Swing, JavaFX & SWT 2
J CellEditor per Button beenden AWT, Swing, JavaFX & SWT 2
K Programm lässt sich nicht beenden AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben