- 浏览: 152582 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
MCQCM:
你的代码有个小问题,不信,你试试abceaefkbn。正确如下 ...
求字符串的最长不重复子串 -
cherry728:
如果服务由多个操作组成,那要怎么办呢。这些操作是需要顺序执行的 ...
一起学BPEL实例教程一(原创) -
zoukailiang0:
请问上面代码中的type变量是怎么获取的啊?我是用默认的pro ...
gef中的属性视图小结 -
我爱死了java:
楼主你好,看你的总结很感谢,不知道你可以把jaf-1_1-fr ...
axis1.4 使用笔记(1) -
nannan408:
ByteArrayOutputStream b ...
java clone方法的使用
总结一下eclipse中Job,Job可以说是eclipse中比较核心又在我们使用中经常碰到的一种机制。本质上是eclipse中的多线程的一种表现,与IRunnable功能类似。但是更加对象化,容易扩展和控制,属于eclipseUI的一部分。表现上的区别:Job会在右下角显示进度条,IRunnable则不会(只有靠MonitorDialog),更加的友好。可以是在前台显示,也可以不显示进度条setSystem(true);。我们最常见到的要属java的自动编译了。
Eclipse为Job提供了3个扩展:WorkspaceJob,UIJob,WorkbenchJob.算上Job本身构成了eclipse对多线程的支持。
WorkspaceJob是为修改资源文件增加的扩展,常见的对文件的打开,保存,等等操作一般需要在这个类中执行。与WorkspaceJob对应的是IWorkspaceRunnable。
UIJob是在 UI线程上干活,所以大家使用时就要注意效率了。因为这个UIJob运行时UI是不刷新的看上去可能像死掉一样。所以数据的处理(长时间运行的程序)需要使用Job基类在UI线程外部运行,SWT界面的刷新,需要在UIJob中。对应的是
display.asyncExec (new Runnable () {public void run () {});
SWT对于所有来自非 UI 线程的调用,将触发SWTException。这些调用必须来自 UI 线程。
WorkbenchJob是UIJob的扩展,也是在UI线程上干活,目的是仅当工作台正在运行时才能调度或运行作业。
介绍一下Job的优先级:
• INTERACTIVE 作业通常优先于其他作业。它们应该是短时间运行或者较少使用处理器的作业,因此,它们不会阻碍其他 INTERACTIVE 作业运行。
• SHORT 作业通常会在一秒钟内完成,但是也可能会时间稍微长一点。它们在后台运行,并且优先于除了 INTERACTIVE 作业之外的所有作业。
• LONG 作业表示更长时间运行的后台作业。它们只有在 INTERACTIVE 作业和 SHORT 作业已经运行之后才运行。
• BUILD 作业表示与构建任务相关联的作业。它们比 LONG 作业的优先级更低。BUILD 作业只有在所有 LONG 作业完成之后才运行。
• DECORATE 作业在系统中的优先级最低。它们用于那些提供可以帮助补充 UI 的信息但是用户通常不会等待的任务。
默认的优先级是LONG。job.setPriority(Job.DECORATE);
做一个小例子:
class MYJob extends Job { public MYJob() { super("MY Job"); } public IStatus run(IProgressMonitor monitor) { monitor.beginTask("MYJob", 60000); for (int i = 0; i < 60000; i++) { System.out.println("This is a MYJob"); monitor.worked(1); } monitor.done(); return Status.OK_STATUS; } } Job job = new MYJob(); job.schedule();
schedule方法就是将当前job加入到等候线程。至于什么时候运行我们就无法决定了。
与java线程一样Job也提供join()方法,阻断当前调用者,直到job运行完了或取消。常见用法:if (!job.cancel()) job.join();取消不成则死等。
我们可以给job加一个监听器:IJobChangeListener,可以根据job的各种状态变化获得响应。Job的状态:
• aboutToRun 是在作业将要运行时发送的。
• awake 是在先前处于休眠状态的作业现在正在等待运行时发送的。
• done 是在作业完成执行时发送的。
• running 是在作业开始运行时发送的。
• scheduled 是在作业已被调度并正在作业队列中等待时发送的。
• sleeping 是在将正在等待的作业置于休眠状态时发送的。
另外Job提供一个getState()方法,但这个方法的结果不可靠,仅仅取得的是相对当前线程的相对结果。不建议使用。
Eclipse也提供了一个全局的Job管理器:IJobManager。
使用Platform.getJobManager();和job.belongsTo()方法配合获得需要的job
再说几个方法:job.setSystem(true),简单的说右下角的图标没了。工作可以偷偷的进行了。
Job.setUser(true),会弹出一个对话框,让我们选是隐藏、取消、详细。大家的svn/cvs同步就是这个了。但是这两个方法要在schedule()前运行。
可以把多个Job混为一组:
IJobManager jobMan = Platform.getJobManager(); group = jobMan.createProgressGroup();job.setProgressGroup(group, 600); // 要在schedule()前运行
适当利用job可以提高界面的友好性,提高应用程序的整体性能
最后,放上两段测试代码。
package view.views; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobManager; import org.eclipse.core.runtime.jobs.Job; public class JobTester { public static void run() { IJobManager jobMan = Platform.getJobManager(); IProgressMonitor myGroup = jobMan.createProgressGroup(); myGroup.beginTask("aaaaaaa", 180000); // needs to show.job.schedule() Job job = new MYJob(); job.setProgressGroup(myGroup, 60000); // specify the units of work the // job job.schedule(); // ... // try { // job.join(); // } catch (InterruptedException e) { // e.printStackTrace(); // } job = new MYJob2(); job.setProgressGroup(myGroup, 60000); // specify the units of work the // job needs to // show.job.schedule() ... job.schedule(); // try { // job.join(); // } catch (InterruptedException e) { // e.printStackTrace(); // } job = new MYJob3(); job.setProgressGroup(myGroup, 60000); // specify the units of work // the job needs to // show.job.schedule() ... job.schedule(); // try { // job.join(); // } catch (InterruptedException e) { // // e.printStackTrace(); // } // myGroup.done(); } static class MYJob extends Job { public MYJob() { super("MY Job"); // this.setUser(true); // this.setSystem(true); } public IStatus run(IProgressMonitor monitor) { monitor.beginTask("MYJob", 60000); for (int i = 0; i < 60000; i++) { System.out.println("This is a MYJob"); monitor.worked(1); } monitor.done(); return Status.OK_STATUS; } } static class MYJob2 extends Job { public MYJob2() { super("MY Job2"); this.setUser(true); } public IStatus run(IProgressMonitor monitor) { monitor.beginTask("MYJob2", 60000); for (int i = 0; i < 60000; i++) { System.out.println("This is a MYJob2"); monitor.worked(1); } monitor.done(); return Status.OK_STATUS; } } static class MYJob3 extends Job { public MYJob3() { super("MY Job3"); // this.setUser(true); } public IStatus run(IProgressMonitor monitor) { monitor.beginTask("MYJob3", 60000); for (int i = 0; i < 60000; i++) { System.out.println("This is a MYJob3"); monitor.worked(1); } monitor.done(); return Status.OK_STATUS; } } }
package view.views; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.IProgressConstants; import org.eclipse.ui.progress.IProgressService; import org.eclipse.ui.progress.IWorkbenchSiteProgressService; import view.Activator; public class ProgressServiceTester { public static void run(IWorkbenchPartSite site) { IProgressService progressService = PlatformUI.getWorkbench() .getProgressService(); IWorkbenchSiteProgressService siteService = (IWorkbenchSiteProgressService) site .getAdapter(IWorkbenchSiteProgressService.class); // progressService.registerIconForFamily(PlatformUI.getWorkbench().getSharedImages(). // getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK), "MY Job"); // siteService.registerIconForFamily(Activator.getImageDescriptor("/icons/sample.gif"), // "MY Job"); siteService.schedule(new MYJob(), 0 /* now */, true /* * use the half-busy * cursor in the * part */); } public static void run() { IProgressService service = PlatformUI.getWorkbench() .getProgressService(); try { runInUI(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } static void busyCursorWhile() throws InvocationTargetException, InterruptedException { IProgressService progressService = PlatformUI.getWorkbench() .getProgressService(); progressService.busyCursorWhile(new IRunnableWithProgress() { public void run(IProgressMonitor monitor) { // do non-UI work for (int i = 0; i < 600000; i++) System.out.println("This is a MYJob"); } }); } static void runInUI() throws InvocationTargetException, InterruptedException { IProgressService progressService = PlatformUI.getWorkbench() .getProgressService(); progressService.runInUI(PlatformUI.getWorkbench().getProgressService(), new IRunnableWithProgress() { public void run(IProgressMonitor monitor) { // do UI work for (int i = 0; i < 100000; i++) System.out.println("This is a MYJob"); } }, null); } static class MYJob extends Job { public MYJob() { super("MY Job"); // this.setUser(true); // this.setSystem(true); } public IStatus run(IProgressMonitor monitor) { monitor.beginTask("MYJob", 600000); for (int i = 0; i < 600000; i++) { System.out.println("This is a MYJob"); monitor.worked(1); } monitor.done(); return Status.OK_STATUS; } @Override public boolean belongsTo(Object family) { return "MY Job".equals(family); } } public static void doPropertyTest() { Job job = new Job("Do Work") { public IStatus run(IProgressMonitor monitor) { // do some work. // Keep the finished job in the progress view only if it is not // running in the progress dialog // Boolean inDialog = (Boolean) // getProperty(IProgressConstants.PROPERTY_IN_DIALOG); // if (inDialog==null||!inDialog.booleanValue()) // setProperty(IProgressConstants.PROPERTY_IN_DIALOG, // Boolean.TRUE); // setProperty(IProgressConstants.KEEPONE_PROPERTY, // Boolean.TRUE); setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE); // System.out.println(this.getProperty(IProgressConstants.NO_IMMEDIATE_ERROR_PROMPT_PROPERTY)); for (int i = 0; i < 6; i++) System.out.println("waiting"); return Status.OK_STATUS; } }; job.setProperty(IProgressConstants.ICON_PROPERTY, Activator .getImageDescriptor("/icons/sample.gif")); IAction gotoAction = new Action("Results") { public void run() { // show the results for (int i = 0; i < 6000; i++) System.out.println("gotoAction"); } }; job.setProperty(IProgressConstants.ACTION_PROPERTY, gotoAction); job.setUser(true); job.schedule(); } }
发表评论
-
AWT,Swing,SWT组件间的对应关系
2010-09-21 11:11 1552Function/Role/Aspect ... -
访问eclipse cvs
2010-09-20 14:43 846:pserver:anonymous@dev.eclipse. ... -
TreeViewer中改变字体和颜色
2010-08-01 01:10 1531改变某一项的字体时可以简单参照下面的代码: @Overrid ... -
RCP程序中从数据库中读取XML内容后显示在Editor中
2010-07-20 23:56 1692这两天花了不少时间在如何把从数据库中读到的内容显示在一个Edi ... -
在RCP中获取IWorkbenchPage对象,实现视图间的事件监听。
2010-04-15 01:13 1340在RCP编程时,我们经常要取得IWorkbenchPage, ... -
eclipse中的线程
2010-03-02 16:48 1078寒假我就上网很少了,真的非常不好意思.eclipse中的线程是 ... -
外部执行Command而Editor不提示已修改的解决办法
2010-01-11 19:22 901理论:有些时候的需求往往不是通过plette来创建模型和连线以 ... -
学习mywork源码速记
2009-12-12 22:09 9451.在action中获得shell ColorDialog ... -
gef中的属性视图小结
2009-12-06 15:38 26161.如果要实现在属性视图中编辑被选择的对象,则至少必须满足以下 ... -
java中产生随机颜色
2009-11-19 14:20 5092产生随机颜色: private Color createRa ... -
SWT/JFace的一些网站链接
2009-11-16 21:04 8471.swt入门 --常用组件的使用 有些组件的用法写得很全。值 ... -
SWT/Jface中的对话框
2009-10-26 16:04 1948应该说,在gui开发中最 ... -
gef(rcp)开发中容易出现的问题
2009-09-11 10:36 1347把碰到的问题放这。。持续添加中! 问题1:建了一个 r ... -
Draw2d中的连线路由器及gef中连线抗锯齿
2009-07-13 10:02 2665前两天也是在javaEye中看到一位大哥关于gef中连线抗锯齿 ... -
EMF features
2009-07-06 15:12 683下面这两个表得了解 -
GEF的一些总结
2009-07-02 17:14 15281.一般来说可以继承三种EditPart,分别是 org. ... -
EMF模型
2009-06-18 15:19 822EMF第二版中的一个模型,第十三章用到 why? -
EMF类间的关系
2009-06-15 18:59 713唉 -
GEF入手系列1
2009-04-28 20:08 1000现在开始系统的学习GEF,所以想把学习过程中的一些东西记下来, ... -
GEF开发常用链接
2009-04-28 08:54 1044Eclipse GEF官网 http://www.eclip ...
相关推荐
在IT行业中,开发Eclipse插件是一个非常实用的技能,特别是在软件工程领域,因为Eclipse作为一款强大的集成开发环境(IDE),广泛应用于Java及其他语言的开发。本篇将基于"开发Eclipse插件之天气预报"这个主题,深入...
- **可扩展性:** 通过插件机制,用户可以为其添加各种功能。 - **标准插件集:** 包含了 Java 开发工具 (JDK) 等一系列基础工具。 #### 1.2 历史背景 - Eclipse 最初由 IBM 开发,并于 2001 年开源。 - 随着时间...
总结,这个压缩包提供了一个完整的Linux环境下基于JDK1.7和Hadoop2.6.0的开发环境,通过Hadoop-Eclipse-Plugin2.6.0,开发者可以在Eclipse中无缝地进行Hadoop应用的开发和调试,极大地提升了开发效率和工作体验。
总结,Eclipse RCP为开发者提供了强大的工具集,可以构建复杂的桌面应用程序。通过理解其组件模型,掌握开发流程,以及运用实战技巧和最佳实践,开发者可以高效地开发出高质量的Eclipse RCP应用系统。在实践中,不断...
总结来说,Hadoop Eclipse插件使得开发者能在熟悉的开发环境中编写、调试和测试Hadoop作业,极大地简化了Hadoop开发流程。通过实例程序的学习,不仅可以加深对Hadoop MapReduce机制的理解,还能提高实际操作能力。...
Quartz提供了一种高度灵活的定时任务管理机制,使得开发者能够轻松地在应用程序中设置复杂的调度策略。 **一、Quartz依赖的JAR包** Quartz的运行依赖于一系列的外部JAR包,包括但不限于以下这些: 1. `activation...
总结来说,"storm job 提交集群测试"涉及到源码编写、打包、配置、提交、监控等多个环节。测试过程中需关注集群环境、拓扑性能、容错性以及异常处理。通过有效利用工具,可以提高测试效率,确保Storm Job在集群上的...
总结来说,JaCoCo是Java项目中获取代码覆盖率的重要工具,它可以通过Maven插件或直接在POM中配置来集成到构建流程中。对于单元测试和接口测试,JaCoCo都能提供详细的覆盖率报告,帮助团队确保测试的质量和完整性。...
【定时任务】在IT行业中,是指程序按照预定的时间间隔或者特定时间点自动执行某一功能的机制。这在很多系统中都是不可或缺的一部分,例如数据备份、日志清理、报表生成等。定时任务通常有两种实现方式:一种是基于...
这些工具使得开发者可以方便地设计、部署和调试工作流程,同时也支持集成到其他开发环境中,如Maven、Eclipse等。 总结来说,jbpm是一个强大的工作流管理工具,它结合了工作流建模、执行、监控和身份管理等功能,...
第 4 章 项目总结不仅对项目的技术实现进行了回顾,还提到了技术创新点,比如高效的数据获取和更新机制,友好的用户界面设计,以及如何利用现有技术提升用户体验。同时,个人收获部分可能包括了开发者在项目过程中...
- **异常处理**:通过补偿处理(Compensation)机制处理流程中的异常情况。 - **补偿处理器**:定义补偿处理器以执行特定的补偿逻辑。 - **子流程**:支持嵌套子流程以及子流程的调用。 - **事务处理**:支持事务...
- **启用Job执行器:** Job执行器负责执行异步任务,需在配置中开启。 - **配置邮件服务器:** 用于发送邮件通知等功能。 - **配置历史:** 历史记录对于审计和监控非常重要,可以配置保留程度。 #### 四、Activiti ...
- **启用 Job 执行器**:如何配置 Job 执行器来处理异步任务。 - **配置邮件服务器**:设置邮件服务器以便发送通知邮件等。 - **配置历史**:选择历史记录的级别,以满足不同的审计需求。 - **为表达式和脚本暴露...
根据各大招聘网站如51job、chinahr等的数据分析显示,Java开发工程师的需求量持续增长,成为IT行业中最为热门的职业之一。 对于初学者而言,学习Java不仅能够提高个人竞争力,还能为职业生涯带来更多的可能性。例如...
- **启用Job执行器**: 启动作业执行机制。 - **配置邮件服务器**: 用于发送邮件通知等。 - **配置历史**: 记录流程执行的历史信息。 - **为表达式和脚本暴露配置**: 允许在流程定义中使用脚本语言。 - **配置部署...
总结来说,jCrontab是一个实用的Java定时任务调度库,其易用性和灵活性使得开发者可以轻松地在项目中实现定时任务。通过学习和使用jCrontab,我们可以提升Java应用的自动化水平,实现定时触发的业务逻辑。
- **代码总结**:总结流程定义中的代码片段。 - **更多思考**:提出深入学习的方向。 #### 8. BPMN 2.0结构 - **自定义扩展**:定义扩展元素以满足特定需求。 - **事件(Event)**:各类事件的定义和用法。 - **...
JBPM(Job Business Process Management)是一个基于Java的开源工作流管理系统,最初由Joram Barrez于2003年创建。JBPM旨在为开发者提供一个简单但强大的平台,用于定义和执行业务流程。与其他同类产品相比,JBPM...