`

UIJob是Job的子类,对Job进行简单的封装,使得方法都在asyncDisplay.asyncExec() 下运行

阅读更多
以下为UIJob的源码,关键在run方法中的
asyncDisplay.asyncExec(new Runnable() {...}
public abstract classUIJob extends Job {
    private Display cachedDisplay;
    public UIJob(String name) {
        super(name);
    }
    public UIJob(Display jobDisplay, String name) {
        this(name);
        setDisplay(jobDisplay);
    }

    public static IStatus errorStatus(Throwable exception) {
        return WorkbenchPlugin.getStatus(exception); 
    }
    public final IStatus run(final IProgressMonitor monitor) {
        if (monitor.isCanceled()) {
            return Status.CANCEL_STATUS;
       }
        Display asyncDisplay = getDisplay();
        if (asyncDisplay == null || asyncDisplay.isDisposed()) {
            return Status.CANCEL_STATUS;
        }
        asyncDisplay.asyncExec(new Runnable() {
            public void run() {
                IStatus result = null;
                Throwable throwable = null;
                try {
                    //As we are in the UI Thread we can
                    //always know what to tell the job.
                    setThread(Thread.currentThread());
                    if (monitor.isCanceled()) {
                         result = Status.CANCEL_STATUS;
                    } else {
                        UIStats.start(UIStats.UI_JOB, getName());
                        result = runInUIThread(monitor);
                    }

                } catch(Throwable t){
                 throwable = t;
                } finally {
                 UIStats.end(UIStats.UI_JOB, UIJob.this, getName());
                    if (result == null) {
                                 result = new Status(IStatus.ERROR,
                                PlatformUI.PLUGIN_ID, IStatus.ERROR,
                                ProgressMessages.InternalError,
                                throwable);
                     }
                    done(result);
                }
            }
        });
        return Job.ASYNC_FINISH;
    }

    public abstract IStatus runInUIThread(IProgressMonitor monitor);

    public void setDisplay(Display runDisplay) {
        Assert.isNotNull(runDisplay);
        cachedDisplay = runDisplay;
    }

    public Display getDisplay() {
        //If it was not set get it from the workbench
        if (cachedDisplay == null && PlatformUI.isWorkbenchRunning()) {
               return PlatformUI.getWorkbench().getDisplay();
         }
        return cachedDisplay;
    }
}



________________________________________________________________
1.Job
使用Job可以确定处理操作何时完成、避免共享资源之间的冲突、与系统上其他的平台命令平衡处理请求,
以及可能以一种不被干扰的形式把结构显示给用户。
2.UIJob
UIJob是运行在Workbench的用户界面线程上的专用Job类。处理操作在runInUIThread方法中定义。当进行调度时,
作业管理器把UIJob放到队列中,直到在Workbench的用户界面线程上执行它。每次只有一个UIJob的对象可以运行,
因为当UIJob运行时,它阻塞了用户界面线程。
当需要在用户界面线程运行一套重要的处理操作,并且希望通过作业管理器把这些请求和其他访问的作业进行平衡时,
可以考虑使用UIJob。通过使用作业管理器来访问用户界面线程,也可使用作业调度规则和Job API来控制盒管理处理过程。

分享到:
评论

相关推荐

    SWT并发例子(后台耗时线程)

    在SWT中,我们可以使用`Display.asyncExec`或`Display.syncExec`方法来在事件调度线程中执行代码,而使用`new Thread()`来创建并启动新的后台线程来执行耗时任务。以下是一个基本的示例: ```java Button button = ...

    swt线程冲突与解决

    这意味着所有对SWT组件的操作(包括创建、更新或销毁)都必须在UI主线程中执行。当开发者尝试在非UI主线程中直接访问或修改SWT组件时,就会触发`SWTException`异常,具体错误信息为“Invalid thread access”。 ...

    Eclipse插件开发问题

    这是因为`launch`方法是在新线程中执行,而不是在Eclipse的UI线程中。在非UI线程中直接操作UI组件会导致错误。为了解决这个问题,开发者可以使用`Display.asyncExec`来异步执行UI更新代码。这段代码确保了在Eclipse...

    使用Eclipse RCP进行桌面程序开发

    ### 使用Eclipse RCP进行桌面程序开发:详细指南 #### 一、Eclipse RCP简介与快速起步 **Eclipse RCP** (Rich Client Platform) 是一种基于Java的开源框架,用于开发桌面应用程序。自从Eclipse 3.0版本以来,RCP...

    一个eclipse的helloworld的插件

    将`HelloWorldAction`类与`plugin.xml`关联,使得在Eclipse界面中可以访问这个动作。在`plugin.xml`的`extension`标签中,添加`command`元素来定义命令,再通过`handler`元素将命令与`HelloWorldAction`关联。同时...

    swt

    通常,使用Display.asyncExec()和Display.syncExec()方法来确保在正确的线程(即UI线程)中更新界面元素,防止出现线程安全问题。 **学习资源:** 博文链接提到的<https://jose-bing.iteye.com/blog/1264042>是一个...

    SWT综合教程及安装指导

    1. GUI线程:在SWT中,所有对GUI的操作必须在事件调度线程(Event Dispatch Thread,EDT)中进行,以保证界面的同步更新和避免数据竞争。 2. 回调机制:使用`Display.asyncExec`或`Display.syncExec`方法来确保在...

    java SWT编写的截图程序

    2. **跨平台:** Java的"一次编写,到处运行"特性使得SWT程序可以在Windows、Linux、macOS等多平台上运行。 3. **丰富的组件库:** SWT提供了大量可自定义的控件,方便构建复杂的应用界面。 总的来说,利用Java SWT...

    swt源码以及jar

    开发者可以通过`Display.syncExec()`或`Display.asyncExec()`方法在UI线程中执行任务。 除了基本的GUI组件,SWT还提供了许多高级功能,比如对话框(Dialogs)、表格(Table)、树形视图(Tree)、进度条...

    基于swt的小软件

    例如,使用`Display.asyncExec`或`Display.syncExec`方法在GUI线程中更新界面,确保界面操作的线程安全。 **Bank子文件** 在"Bank"这个子文件中,很可能是实现了一款与银行相关的模拟软件,可能包括账户管理、交易...

    Graphics Moving Package

    在IT行业中,图形移动是一个广泛涉及的领域,尤其是在游戏开发、用户界面设计和动画制作等方面。这个名为"Graphics Moving Package"的压缩包可能包含了与Java编程语言中的SWT(Standard Widget Toolkit)库相关的...

    SWT API 资料

    为了实现异步处理,可以使用`Display.asyncExec`和`Display.syncExec`方法,它们能够在正确的线程上下文中执行回调。 ### 9. 高级特性 SWT还提供了许多高级特性,如拖放支持、打印功能、数据库访问、国际化和本地...

    SWT应用的开发实例:没有使用到OSGi

    这篇博客文章“SWT应用的开发实例:没有使用到OSGi”可能是介绍如何在不依赖OSGi框架的情况下,使用SWT进行应用程序开发的具体步骤和实践案例。 OSGi(Open Service Gateway Initiative)是一种模块化系统,主要...

    swt 多线程

    总结来说,SWT的多线程机制是通过Display类提供的`asyncExec`、`syncExec`和`timerExec`方法来实现的,它们允许开发者在不阻塞UI线程的情况下执行后台任务。理解和熟练运用这些方法是构建高效、响应性强的SWT应用的...

Global site tag (gtag.js) - Google Analytics