类MyAction:
public class MyAction implements IRunnableWithProgress {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
MyJob myJob = new MyJob("My Job ");
myJob
.addJobChangeListener(new MyJobChangeAdapter(Display
.getCurrent()));
myJob.setUser(true);
myJob.schedule();
monitor.subTask("Scheduled sending for recipient: ");
}
class MyJob extends Job {
public MyJob(String name) {
super(name);
}
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
System.out.println("发呆中...");
Thread.sleep(15000);// 模拟一个需要10秒的工作
} catch (InterruptedException e) {
e.printStackTrace();
}
return Status.OK_STATUS;
}
}
class MyJobChangeAdapter extends JobChangeAdapter {
private final Display display;
/**
* @param display
*/
public MyJobChangeAdapter(Display display) {
super();
this.display = display;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.jobs.JobChangeAdapter#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void done(final IJobChangeEvent event) {
display.asyncExec(new Runnable() {
public void run() {
IStatus iStatus = event.getResult();
String errorMessage = iStatus.getMessage();
Shell shell = display.getActiveShell();
if (IStatus.OK == iStatus.getCode())
MessageDialog.openInformation(shell, event.getJob()
.getName(), "Mail Sent Successfully");
else
MessageDialog.openError(shell, "Error sending mail",
errorMessage);
}
});
}
}
}
测试类:ThreadTest
public class ThreadTest {
/**
* @param args
*/
public static void main(String[] args) {
final Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(600, 400);
shell.setLayout(new FillLayout());
MyAction myAction = new MyAction ();
ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog (Display.getCurrent().getActiveShell() );
boolean separateThread = false;
boolean cancelable = true;
try {
progressMonitorDialog.run (separateThread, cancelable, myAction);
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}