還好,eclipse為我們開發插件提供了一個方便的UI線程包,大大的簡化了很多底層復雜的東西.先看看幾個簡單的概念.
1.SWT UI線程
SWT用的是操作系統直接支持的線程模式,程序會在主程序里運行一個時間循環并依次在這個線程里響應事件.看下面這段代碼,UI線程就是創建Display的那個線程.
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell (display);
shell.open ();
// 開始事件循環
// 關掉窗口后
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ())
display.sleep ();
}
display.dispose ();
}
簡單的小程序里,一個UI線程就能夠滿足需要了。但假如是長時間的操作,你就最好不要用UI線程來做這些事,可以交給Job去做.它其實就是另外啟動的線程,也就是等會我要說的非UI線程.
2、Job
Job類由org.eclipse.core.runtime插件提供.它能夠讓客戶程序員輕松的在另外的線程中執行代碼??匆粋€小例子:
Job job = new Job("My First Job") {
PRotected IStatus run(IProgressMonitor monitor) {
System.out.println("Hello World (from a background job)");
return Status.OK_STATUS;
}
};
job.setPriority(Job.SHORT);
job.schedule(); // start as soon as possible
Job的默認優先級是Job.Long,這里例子中的優先級要比它高,只要調用Job#schedule(),它就會盡快在另外的線程中運行run()中的代碼。再看一個小例子:
final Job job = new Job("Long Running Job") {
protected IStatus run(IProgressMonitor monitor) {
try {
while(hasMoreWorkToDo()) {
// do some work
// ...
if (monitor.isCanceled()) return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
} finally {
schedule(60000); // start again in an hour
}
}
};
job.addJobChangeListener(new JobChangeAdapter() {
public void done(IJobChangeEvent event) {
if (event.getResult().isOK())
postMessage("Job completed sUCcessfully");
else
postError("Job did not complete successfully");
}
});
job.setSystem(true);
job.schedule(); // start as soon as possible
新聞熱點
疑難解答