Nota: este blog entry sugiere la siguiente aplicación para el gancho de cierre:
El código de parada se debe ejecutar en el hilo de interfaz de usuario y no se debe ejecutar si el banco está cerrado por otros medios. Todos los editores sucios se guardan automáticamente. Esto evita que el usuario que está probablemente en casa duerma cuando su computadora se apaga. Finalmente, el banco de trabajo está cerrado.
(por lo que no
exactamente su escenario, pero la aplicación sigue siendo interesante porque muestra cómo ejecutar dentro del hilo de interfaz de usuario)
private class ShutdownHook extends Thread {
@Override
public void run() {
try {
final IWorkbench workbench = PlatformUI.getWorkbench();
final Display display = PlatformUI.getWorkbench()
.getDisplay();
if (workbench != null && !workbench.isClosing()) {
display.syncExec(new Runnable() {
public void run() {
IWorkbenchWindow [] workbenchWindows =
workbench.getWorkbenchWindows();
for(int i = 0;i < workbenchWindows.length;i++) {
IWorkbenchWindow workbenchWindow =
workbenchWindows[i];
if (workbenchWindow == null) {
// SIGTERM shutdown code must access
// workbench using UI thread!!
} else {
IWorkbenchPage[] pages = workbenchWindow
.getPages();
for (int j = 0; j < pages.length; j++) {
IEditorPart[] dirtyEditors = pages[j]
.getDirtyEditors();
for (int k = 0; k < dirtyEditors.length; k++) {
dirtyEditors[k]
.doSave(new NullProgressMonitor());
}
}
}
}
}
});
display.syncExec(new Runnable() {
public void run() {
workbench.close();
}
});
}
} catch (IllegalStateException e) {
// ignore
}
}
}
Se establece, como usted ha dicho, en IA aplicación:
public class IPEApplication implements IApplication {
public Object start(IApplicationContext context) throws Exception {
final Display display = PlatformUI.createDisplay();
Runtime.getRuntime().addShutdownHook(new ShutdownHook()); }
// start workbench...
}
}
Tengo eso también, pero si la JVM termina esta sección no se llama. Por ejemplo, como resultado de System.exit() –