- 浏览: 125929 次
- 性别:
- 来自: 上海
最新评论
-
一叶之源:
总结一下eclipse中的Job机制 -
xinxinlong:
lAnchor.getDy1() 是什么意思
操作excel--稍后整理 -
defrag_sly:
3.7是好用的,只是再mac下面不支持,mac不支持的效果还有 ...
swt下如何做出一个反向展开效果的tree -
defrag_sly:
eclipse3.7不好用了。谁知道给补充一下。
swt下如何做出一个反向展开效果的tree -
hamlzf:
好文!mark!
基于 OSGi 的面向服务的组件编程
总结一下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中。对应的是
WorkbenchJob是UIJob的扩展,也是在UI线程上干活,目的是仅当工作台正在运行时才能调度或运行作业。
介绍一下Job的优先级:
• INTERACTIVE 作业通常优先于其他作业。它们应该是短时间运行或者较少使用处理器的作业,因此,它们不会阻碍其他 INTERACTIVE 作业运行。
• SHORT 作业通常会在一秒钟内完成,但是也可能会时间稍微长一点。它们在后台运行,并且优先于除了 INTERACTIVE 作业之外的所有作业。
• LONG 作业表示更长时间运行的后台作业。它们只有在 INTERACTIVE 作业和 SHORT 作业已经运行之后才运行。
• BUILD 作业表示与构建任务相关联的作业。它们比 LONG 作业的优先级更低。BUILD 作业只有在所有 LONG 作业完成之后才运行。
• DECORATE 作业在系统中的优先级最低。它们用于那些提供可以帮助补充 UI 的信息但是用户通常不会等待的任务。
默认的优先级是LONG。job.setPriority(Job.DECORATE);
做一个小例子:
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混为一组:
适当利用job可以提高界面的友好性,提高应用程序的整体性能
最后,放上两段测试代码。
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(); } }
发表评论
-
TableEditor 让我郁闷的
2011-12-21 17:25 1280TableItem item = table.getIte ... -
eclipse search
2011-08-09 13:04 904http://www.ibm.com/developerwor ... -
eclipse 中关于字符串匹配的几个类
2009-12-17 12:07 1538在做检索功能时,必然会遇到字符串匹配的问题。eclipse与j ... -
eclipse Drag&Drop机制图解
2009-11-20 15:55 1113工作需要,debug了eclipse的drag&dro ... -
Drag & Drop eclipse Viewer to GMF Editor
2009-10-09 11:21 18741,添加Viewer的Drag support priva ... -
请问,eclipse e4 究竟是什么?愿能集思广益
2009-08-13 16:05 905请问,eclipse e4 究竟是什么?愿能集思广益 -
简单介绍eclipse中的重构
2009-08-13 11:28 2336Eclipse中提供了几个扩展点,方便扩展重构功能。 基本的重 ... -
swt下如何做出一个反向展开效果的tree
2009-08-10 10:59 1769如题,其实很简单,即在tree的构造方法里加入样式参数{SWT ... -
eclipse 开发中的快捷键
2009-05-19 12:15 881Alt+Shift+F1 eclipse 3.4下会打开一个p ... -
将gmfeditor结合到mutipage中
2009-05-04 16:26 1272http://www.eclipse.org/articles ... -
eclipse还有什么不能做???
2009-04-09 15:13 922http://www.vimeo.com/1195398?pg ... -
如何把propertiesView的tab功能移植到EditorPart中
2009-04-01 10:12 2803最近有个调查将上图tab propertiesView的外 ... -
Eclipse中TextEditor常用扩展整理
2009-03-11 14:11 5433总结一下TextEditor,eclips ... -
eclipse中对redo与undo的支持
2009-03-10 16:14 4456大家在使用eclipse时,一定对ctrl+z和ctrl+r使 ... -
以GefTree为例解释一下如何结合使用gef+emf(2)
2009-03-05 14:24 2959创建gef框架。 按照基本习惯定义gef各部分包名: G ... -
以GefTree为例解释一下如何结合使用gef+emf(1)
2009-03-05 14:20 1471以GefTree为例解释一下如何结合使用gef+emf。 (1 ... -
gef写的tree例子--模型修改为emf
2009-03-04 16:11 2109模型部分已经修改为emf模型。 使用emf模型最大的好处是: ... -
用gef写的一个tree例子(无移动)
2009-02-26 18:06 1411又整理一下代码,增加了删除。 移动决定不做了,都是坐标之类的算 ... -
用gef写的一个tree例子(无移动,删除)
2009-02-26 11:16 1012计划 1、删除,移动做上去 2、将模型层提供为扩展点,( ... -
关于image,ImageDescriptor,imageRegistry
2009-02-20 17:31 5010相信不需要多说,大家都明白调用本地资源例如(icon)这类的资 ...
相关推荐
Eclipse中Maven插件Eclipse中Maven插件Eclipse中Maven插件Eclipse中Maven插件
Eclipse中英文菜单对照表,帮助新手快速掌握使用Eclipse进行开发
eclipse中文pdf使用手册eclipse中文pdf使用手册eclipse中文pdf使用手册eclipse中文pdf使用手册eclipse中文pdf使用手册eclipse中文pdf使用手册
该文件总结了eclipse工具中基本的默认快捷键,适合新手同学学习
Eclipse中swing插件Eclipse中swing插件Eclipse中swing插件
Eclipse中freemarker插件Eclipse中freemarker插件Eclipse中freemarker插件Eclipse中freemarker插件Eclipse中freemarker插件
eclipse+ MinGW总结,对于eclipse的开发大有裨益
eclipse快捷键大全总结学习,使用eclipse必学习知识
本文档总结了eclipse中常用快捷键,能够有效提高开发效率。
eclipse中git插件eclipse中git插件eclipse中git插件eclipse中git插件eclipse中git插件
eclipse中svn插件的使用
在Eclipse中调试程序在Eclipse中调试程序
作名词时,eclipse常和介词in连用,如Fred was in eclipse, exiled to a small post in the south.(弗雷德失势了,被打发到南方去担任一个小差使。)作动词时,如:She is quite eclipsed by her clever younger ...
Eclipse中文帮助文档,包含了Eclipse常用使用方法,一些最常用的配置......
eclipse中使用CVS eclipse中使用CVS eclipse中使用CVS
Eclipse中Python插件Eclipse中Python插件
eclipse中velocity插件
Eclipse中SWT插件的安装Eclipse中SWT插件的安装
Eclipse中svn插件Eclipse中svn插件
在打开的swing窗口中的第一个文本框选择org.eclipse.wst.javascript.ui_xxxxxxx.jar,在输出目录中选择您要输出的目录,如c:\ 5. 点击“generator”按钮,在c:\下找到org.eclipse.wst.javascript.ui_xxxxxxx.jar...