您现在的位置是:首页 >

linux多线程通信 Eclipse客户端程序中多线程的使用[4]

火烧 2021-09-05 19:34:18 1045
Ecli e客户端程序中多线程的使用[4]   延时执行Jo 避免无用的Jo 运行  我们经常需要根据选中的对象刷新我们部分的界面元素 如果我们连续很快的改变选择 而每次刷新界面涉及到的区域比较大时

Eclipse客户端程序中多线程的使用[4]  

  延时执行Job 避免无用的Job运行

  我们经常需要根据选中的对象刷新我们部分的界面元素 如果我们连续很快的改变选择 而每次刷新界面涉及到的区域比较大时 界面会出现闪烁 从用户的角度来说 我们很快的改变选择 希望看到的只是最后选中的结果 中间的界面刷新都是不必要的

  在Jface中 StructuredViewer提供了addPostSelectionChangedListener方法 如果我们使用这个方法监听selectionChanged事件 当用户一直按著方向键改变选中时 我们只会收到一个selectionChanged事件 这样我们可以避免过度的刷新界面

  实际上 Jface中就是通过延时执行Job来实现这一功能的 我们也可以自己实现类似功能

 private final static Object UPDATE_UI_JOBFAMILY = new Object();tableviewer addSelectionChangedListener (new ISelectionChangedListener (){

 public void selectionChanged(SelectionChangedEvent event){  Job getJobManager() cancel(UPDATE_UI_JOBFAMILY);  new UIJob( 更新界面 ) {              protected IStatus runInUIThread (IProgressMonitor monitor) {                   //更新界面                   return Status OK_STATUS;               }

   public boolean belongsTo(Object family){    return family== UPDATE_UI_JOBFAMILY;   }             } schedule( ); }});

  首先 我们需要将界面更新的代码放到一个UIJob中 同时我们将Job延时 毫秒执行(我们可以根据需要改变延时的时间) 如果下一个selectionChanged事件很快到来 我们的调用Job getJobManager() cancel(UPDATE_UI_JOBFAMILY)将以前未运行的Job取消 这样只有最后一个Job会真正运行

  在UI线程中等待非UI线程的结束 有时 我们在UI线程中需要等待一个非UI线程执行完 我们才能继续执行 例如 我们在UI线程中要显示某些数据 但是这些数据又需要从数据库或者远程网络获取 于是 我们会启动一个非UI的线程去获取数据 而我们的UI线程必须要等待这个非UI线程执行完成 我们才能继续执行 当然 一种简单的实现方法是使用join 我们可以在UI线程中调用非UI线程的join方法 这样我们就可以等待它执行完了 我们再继续 但是 这会有一个问题 当我们的UI线程等待时 意味着我们的程序不会再响应界面操作 也不会刷新 这样 用户会觉得我们的程序象死了一样没有反应 这时 我们可以使用ModalContext类 你可以将你要执行的获取数据的任务用ModalContext的run方法来运行(如下) ModalContext会将你的任务放到一个独立的非UI线程中执行 并且等待它执行完再继续执行 与join方法不同的是 ModalContext在等待时不会停止UI事件的处理 这样我们的程序就不会没有响应了

linux多线程通信 Eclipse客户端程序中多线程的使用[4]

try {   ModalContext run(new IRunnableWithProgress(){    public void run(IProgressMonitor monitor)  throws InvocationTargetException InterruptedException {          ModalContext checkCanceled(monitor);    }       } true new NullProgressMonitor() Display getCurrent());  } catch (InvocationTargetException e) {     } catch (InterruptedException e) {     }

lishixinzhi/Article/program/Java/gj/201311/27700  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码