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?
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();
}
});
}
}
}