package org.eclipse.update.ui.internal.model; | |
/* | |
* (c) Copyright IBM Corp. 2000, 2001. | |
* All Rights Reserved. | |
*/ | |
import org.eclipse.jface.operation.*; | |
import org.eclipse.core.runtime.*; | |
import org.eclipse.swt.widgets.*; | |
import java.lang.reflect.InvocationTargetException; | |
import org.eclipse.jface.util.Assert; | |
public class BackgroundThread extends Thread { | |
/** | |
* The operation to be run. | |
*/ | |
private IRunnableWithProgress runnable; | |
/** | |
* The exception thrown by the operation starter. | |
*/ | |
private Throwable throwable; | |
/** | |
* The progress monitor used for progress and cancelation. | |
*/ | |
private IProgressMonitor progressMonitor; | |
/** | |
* The display used for event dispatching. | |
*/ | |
private Display display; | |
/** | |
* Indicates whether to continue event queue dispatching. | |
*/ | |
private volatile boolean continueEventDispatching = true; | |
public BackgroundThread(IRunnableWithProgress operation, IProgressMonitor monitor, Display display) { | |
super("BackgroundThread"); //$NON-NLS-1$ | |
Assert.isTrue(monitor != null && display != null); | |
runnable = operation; | |
this.progressMonitor = monitor; | |
this.display = display; | |
} | |
/* (non-Javadoc) | |
* Method declared on Thread. | |
*/ | |
public void run() { | |
try { | |
if (runnable != null) | |
runnable.run(progressMonitor); | |
} catch (InvocationTargetException e) { | |
throwable= e; | |
} catch (InterruptedException e) { | |
throwable= e; | |
} catch (RuntimeException e) { | |
throwable= e; | |
} catch (ThreadDeath e) { | |
// Make sure to propagate ThreadDeath, or threads will never fully terminate | |
throw e; | |
} catch (Error e) { | |
throwable= e; | |
} finally { | |
// Make sure that all events in the asynchronous event queue | |
// are dispatched. | |
display.syncExec(new Runnable() { | |
public void run() { | |
// do nothing | |
} | |
}); | |
// Stop event dispatching | |
continueEventDispatching= false; | |
// Force the event loop to return from sleep () so that | |
// it stops event dispatching. | |
display.asyncExec(null); | |
} | |
} | |
public Throwable getThrowable() { | |
return throwable; | |
} | |
} | |