最近在项目开发过程中,需要通过后台处理大量的业务数据,而在UI界面发出查询命令到后台返回查询结果需要时间,特别是这些数据又需要从数据库或者远程网络获取,通常情况下UI界面会一直等待查询方法执行完了才会进行响应,在这个过程中看起来界面好像死了一样,给用户的体验是非常的差,如果我们能通过一个进度条显示当前的进度,就算做一个假的进度显示也好,可以打发用户无聊的时间嘛,这时候我们就要考虑使用多线程了。
值得高兴的是我们使用Eclipse开发项目的话,可以使用Eclipse提供的多线程支持,在RCP中要在非UI线程中执行UI线程的操作,最简单的方式就是display.syncExec或者display.asyncExec,一个是同步处理一个是异步处理,如果UI线程所需的时间较长的话,则应该使用display.asyncExec,可以让程序并发允许。
在这里推荐使用Job这个类,而不是Java中的Thread,为什么?先列出它的好处来:
我们可以在它的run方法中执行比较消耗时间的方法,而且可以将它转入到后台允许,可以不打扰现在的操作,不过这个方法唯一的缺点是不能访问UI线程,可惜,如果我们要访问UI线程的话就要使用UIJob这个类了,其实UIJob是Job的一个子类,这个方法就可以访问UI线程了,不过这个方法在执行的时候意味着我们的程序不会再响应界面操作,也不会刷新,这样,用户会觉得我们的程序象死了一样没有反应。
- Job是可重用的工作单元,一个Job我们可以很方便的让它多次执行。
- Job提供了方便的接口,使得我们在处理中能够很方便的与外界交流,报告当前的执行进度
- Eclipse提供了相应的机制使得程序员可以方便的介入Job的调度,例如我们可以方便的实现每次只有一个同一类型的Job在运行
- Eclipse缺省提供了Job管理的程序,可以查看当前所有的Job和它们的进度,也提供UI终止、暂停、继续指定的Job
- 使用Job可以提高程序的性能,节省线程创建和销毁的开销。Eclipse中的Job封装了线程池的实现。当我们启动一个Job时,Eclipse不会马上新建一个Thread,它会在它的线程池中寻找是否有空闲的线程,如果有空闲线程,就会直接用空