知识大全 关于Eclipse中UI程序的线程的讨论

Posted

篇首语:饱带饥粮,晴带雨伞。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 关于Eclipse中UI程序的线程的讨论相关的知识,希望对你有一定的参考价值。

关于Eclipse中UI程序的线程的讨论  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

虽然各个操作系统之间的线程机制是不一样的 但是大致是相同的 当用户使用GUI程序时 如果点鼠标或按下键盘上的键等时 操作系统会产生对应的GUI事件 它来决定哪个窗口或程序来接受每一个事件并且放到程序的事件队列中       任何GUI程序的底层结构就是一个事件循环 程序首先初始化事件循环 并开始循环 这个循环会从事件队列依次接收GUI事件并一一做出相应的反应 程序应该对事件做出快速的反应使程序一直对用户有响应 举个例子 用户点了一下程序里的一个按钮结果程序就没反应了 那么这个程序应该算是一个失败的程序吧       如果某个UI事件引发了某个需要长时间的事务 那么应该把它放到一个另外的单独的线程中 这样程序的那个事件循环就能够马上回来响应用户的下一个操作 线程是非常复杂的一个主题 如果处理的不好很容易造成死锁等很糟糕的情况

  还好 eclipse为我们开发插件提供了一个方便的UI线程包 大大的简化了很多底层复杂的东西 先看看几个简单的概念    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线程

   Job  Job类由re 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( ); // start again in an hour                        ;  job addJobChangeListener(new JobChangeAdapter()         public void done(IJobChangeEvent event)         if (event getResult() isOK())           postMessage( Job pleted successfully );           else              postError( Job did not plete successfully );             );  job setSystem(true);     job schedule(); // start as soon as possible

  monitor是一个进度显示条 它会在运行job时自动显示 如果任务成功运行完成 返回Status OK_STATUS 如果中途被用户在进度显示条那里中断 就返回Status CANCEL_STATUS 上面schedule( );它是让job每过 小时就自动运行 Job又一个非常强大的功能 然后后面是可以给job添加监听器 job setSystem(true);这一句是把这个job设置为系统级别的 如果调用setUser(true) 那么就被定义为用户级别的 用户级别和默认级别的job   在运行时会以UI形式反映出来 如果是用户job 那么会弹出一个进度显示窗口 能让用户选择在后台里运行 下图是一个job自动运行时的效果:   再介绍job常常用到的一个方法Job#join() 系统调用到某个job 调用它的run()方法 再看下面这个例子:    class TrivialJob extends Job       public TrivialJob()          super( Trivial Job );            public IStatus run(IProgressMonitor monitor)          System out println( This is a job );         return Status OK_STATUS;              job的创建和计划如下所示:

  TrivialJob job = new TrivialJob();   System out println( About to schedule a job );   job schedule();   System out println( Finished scheduling a job );     他们的执行是和时间没关系的 输出可能如下:   About to schedule a job   This is a job   Finished scheduling a job

  也可能是:

  About to schedule a job   Finished scheduling a job   This is a job     如果希望某个job运行完成后在继续时 可以使用join()方法 join()会一直阻塞到该job运行完      例子:   TrivialJob job = new TrivialJob();   System out println( About to schedule a job );   job schedule();   job join();   if (job getResult() isOk())      System out println( Job pleted with success );   else      System out println( Job did not plete successfully );

  上面的代码执行后 输出应该就是这样:

  About to schedule a job   This is a job   Job pleted with success

  Job的功能是很强大的 还有很多功能我以后会介绍 也可以查阅官方帮助文档 这里先把几个常用的问题解决掉 参见:?topic=/ eclipse platform doc isv/guide/

   如果在Job中加上改变UI的代码就会失败 原因如下:  如果是在非UI线程中调用UI SWT就会抛出一个SWTException 要在一个非UI线程改变UI的话有几种技术:

  第一种 用:Display#syncExec(Runnable)或Diaplay#asyncExec(Runnable)

  第二种:  已经开发了另外一种Job 就是UIJob 可以直接在它里面运行改变UI的代码 其实它就是在SWT的asyncExec()方法里运行的 所有继承UIJob的类应该覆写runInUIThread方法而不是run方法

   关于进度显示  在Jface中:   eclipse jface operations包定义了一些接口用来在进度条下运行长时间的任务 可以参见:?topic=/ eclipse platform doc isv/guide/

  在eclipse插件和RCP开发中:  用户级别的job是互操作性最强的 它不仅能够让用户用Cancel键取消job 而且可以在Detail中展示具体情况 但是注意:  Detail只会在下面两种方法中出现:  IProgressService#busyCursorWhile或  IProgressService#runInUI   )IProgressService#busyCursorWhile的用法例子:  注意这里的run()中做些和UI无关的事 IProgressService progressService = PlatformUI getWorkbench() getProgressService();   progressService busyCursorWhile(new IRunnableWithProgress()      public void run(IProgressMonitor monitor)          //do non UI work         );  效果:   ) IProgressService#runInUI的用法例子:  注意这里的run()中可以做些和UI有关的事 progressService runInUI(      PlatformUI getWorkbench() getProgressService()       new IRunnableWithProgress()          public void run(IProgressMonitor monitor)             //do UI work                     Platform getWorkspace() getRoot());  效果:  这里最后一个参数可以是null 或者是这个操作的规则 在这里我们是设定运行这个UI操作时锁定工作台   更加具体的可以参见:?topic=/ eclipse platform doc isv/guide/

cha138/Article/program/Java/ky/201311/28076

相关参考

知识大全 Eclipse客户端程序中多线程的使用[1]

Eclipse客户端程序中多线程的使用[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文

知识大全 Eclipse客户端程序中多线程的使用[5]

Eclipse客户端程序中多线程的使用[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  针对

知识大全 Eclipse客户端程序中多线程的使用[4]

Eclipse客户端程序中多线程的使用[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  延时

知识大全 Eclipse客户端程序中多线程的使用[3]

Eclipse客户端程序中多线程的使用[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这样

知识大全 Eclipse客户端程序中多线程的使用[6]

Eclipse客户端程序中多线程的使用[6]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Jo

知识大全 Eclipse客户端程序中多线程的使用[2]

Eclipse客户端程序中多线程的使用[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Ec

知识大全 关于Java主线程

关于Java主线程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  java应用程序中会有一个ma

知识大全 用java多线程断点续传实践

  /**  *authorannegu  *date  */  annegu做了一个简单的Http多线程的下载程序来讨论一下多线程并发下载以及断点续传的问题  这个程序的功能就是可以分多个线程从目标

知识大全 关于线程的停止问题

  多线程是java的一个优势java使得程序员可以很方便的进行多线程程序开发获得更好的性能  关于多线程的概念以及一般的多线程编程比如如何以及为何实现runnable接口为何stop()会被Depr

知识大全 介绍下Eclipse中如何debug程序

介绍下Eclipse中如何debug程序?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  怎样在