快速业务通道

Eclipse客户端程序中多线程的使用 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
行。简单的我们可以通过下面的代码实现 。我们先定义一个如下rule:

private ISchedulingRule Schedule_RULE = new ISchedulingRule() {      public boolean contains(ISchedulingRule rule) {        return this.equals(rule);      }      public boolean isConflicting(ISchedulingRule rule) {        return this.equals(rule);      }    };

对于需要避免同时运行的Job,我们可以将它们的rule设成上面定义的rule。如:

myjob1.setRule(Schedule_RULE);    myjob2.setRule(Schedule_RULE);

这样对于myjob1和myjob2这两个Job,它们不会再同时执行。Myjob2会等待myjob1执行完再执行。这是 由Eclipse的JobManager来提供实现的。JobManager可以保证所有启动的Job中,任意两个Job的rule是没 有冲突的。我们在上面定义的rule是最简单的。我们可以重写isConflicting函数来实现一些更加复杂的 控制,比如控制同时同类型的Job最多只有指定的个数在运行。但是我们要注意,isConflicting方法不能 过于复杂。一旦一个Job的rule与其他Job的rule有冲突,isConflicting方法会调用很多次。如果其中的 计算过于复杂,会影响整体的性能。

根据需要执行Job

由于我们有的Job有可能不是立即执行的,在有些情况下,等到该Job准备执行的时候,该Job所要执行 的任务已经没有意义了。这时,我们可以使用Job的shouldSchedule()和shouldRun()来避免Job的运 行。在我们定义一个Job时,我们可以重载shouldSchedule和shouldRun方法。在这些方法中,我们可以检 查Job运行的一些先决条件,如果这些条件不满足,我们就可以返回false。JobManager在安排Job运行时 ,它会先调用该Job的shouldSchedule方法,如果返回为false,JobManager就不会再安排这个Job运行了 。同样,JobManager在真正启动一个线程运行一个Job前,它会调用该Job的shouldRun方法,如果返回 false,它不再运行这个Job。在下面的例子中,我们希望启动一个Job在十秒钟之后更新文本框中的内容 。为了保证我们的Job运行时是有意义的,我们需要确保我们要更新的文本框没有被销毁,我们重载了 shouldSchedule和shouldRun方法。

Text text = new Text(parent,SWT.NONE); UIJob refreshJob = new UIJob(“更新界面”){ public IStatus runInUIThread(IProgressMonitor monitor) {      text.setText(“新文本”);      return Status.OK_STATUS;    }    public boolean shouldSchedule(){      return !text.isDisposed();    }    public boolean shouldRun(){      return !text.isDisposed();    } }; refreshJob.schedule(10000);

Eclipse客户端程序中多线程的使用(4)

时间:2011-08-11 IBM 梁 骞

在UI线程中涉及长时间处理的任务

我们经常碰到这样一种情况:用户操作菜单或者按钮会触发查询大量数据,数据查询完后更新表格等 界面元素。用户点击菜单或者按钮所触发的处理程序一般处于UI线程,为了避免阻塞UI,我们必须把数据 查询等费时的工作放到单独的Job中执行,一旦数据查询完毕,我们又必须更新界面,这时我们又需要使 用UI线程进行处理。下面是处理这种情况的示例代码:

button.addSelectionListener(new SelectionListener(){    public void widgetSelected(SelectionEvent e){      perform();    }    public void widgetDefaultSelected(SelectionEvent e){      perform();    }    private void perform(){      Job job = new Job(“获取数据”){        protected IStatus run(IProgressMonitor monitor){          // 在

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号