首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

RCP 线程的开发运用

2012-10-06 
RCP 线程的开发应用http://www.blogjava.net/gembin/archive/2008/03/21/187750.htmlEclipse RCP中多线程J

RCP 线程的开发应用

http://www.blogjava.net/gembin/archive/2008/03/21/187750.html

Eclipse RCP中多线程Job使用
本文分析了Eclipse中多线程程序的实现,讨论了在Eclipse客户端程序开发中应用多线程的方法和要注意的问题,同时也讨论了多线程程序的一些调试和问题解决的方法。
<!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->

Eclipse 作为一个开发平台,使用越来越广泛,基于Eclipse Rich Client Platform开发的客户端程序也越来越多。在当今越来越复杂的应用环境中,我们的客户端程序不可避免的要同时进行多任务的处理。一个优异的客户端程序都会允许用户同时启动多个任务,从而大大提高用户的工作效率以及用户体验。本文中我们来谈谈Eclipse中实现多任务的方式。

在我们基于Eclipse的Java程序中,我们有很多种方式提供多任务的实现。熟悉Java的朋友立即会想到Java的Thread类,这是Java中使用最多的一个实现多任务的类。Eclipse平台为多任务处理提供了自己的API,那就是Job以及UIJob。Eclipse中的Job是对Java Thread的一个封装,为我们实现多任务提供了更方便的接口。以下是Job的基本用法:

清单 1. Job用法示例



如果主线程发生死锁,函数调用栈的最上层一般会是你自己的函数调用,你可以查看一下你当前的函数调用以确定主线程在等待什么 使用同样的方法查看其他线程,特别是那些等待UI线程的线程

我们需要找出当前线程相互的等待关系,以便找出死锁的原因。我们找出死锁的线程后就可以针对不同情况进行处理:

减小锁的粒度,增加并发性 调整资源请求的次序 将需要等待资源的任务放到独立的线程中执行

?

Job使用中要注意的问题

不 要在Job中使用Thread.sleep方法。如果你想要让Job进入睡眠状态,最好用Job的sleep方法。虽然,使用Thread.sleep和 Job的sleep方法达到的效果差不多,但是它们实现的方式完全不同,对系统的影响也不一样。我们知道Eclipse中Job是由Eclipse的 JobManager来管理的。如果我们调用Job的sleep方法,JobManager会将Job转入睡眠状态,与其对应的线程也会重新放入线程池等 待运行其他Job。而如果我们在Job中直接调用Thread.sleep方法,它会直接使运行Job的线程进入睡眠状态,其他Job就不可能重用这个线 程了。同时,虽然运行该Job的线程进入了睡眠状态,Job的状态还是Running(运行状态),我们也不能用Job的wakeup方法唤醒该Job了 Job 的取消。一般我们会直观的认为,一旦调用Job的cancel方法,Job就会停止运行。实际上,这并不一定正确,当Job处于不同的状态时,我们调用 Job的cancel方法所起的效果是不同的。当Job在WAITING状态和SLEEPING状态时,一旦我们调用cancel方法, JobManager会将Job直接从等待运行的队列中删除,Job不会再运行了,这时cancel方法会返回true。但是如果Job正在运行, cancel方法调用并不会立即终止Job的运行,它只会设定一个标志,指明这个Job已经被取消了。我们可以使用Job的run方法传入的参数 IProgressMonitor monitor,这个参数的isCanceled方法会返回Job是否被取消的状态。如果需要,我们必须在我们的代码的适当位置检查Job是否被取消的标 志,作出适当的响应。另外,由于调用Job的cancel方法不一定立即终止Job,如果我们需要等待被取消的Job运行完再执行,我们可以用如下代码:
 if (!job.cancel())                job.join();

Join方法的使用。由于join方法会导致一个线程等待另一个线程,一旦等待线程中拥有一个被等待线程所需要的锁,就会产生死锁。当我们的线程中需要用到同步时,这种死锁的情况非常容易出现,所以我们使用join时必须非常小心,尽量以其他方法替代。 避 免过时的Job造成的错误。由于我们启动的线程并不一定是马上执行的,当我们的Job开始运行时,情况可能发生了变化。我们在Job的处理代码中要考虑到 这些情况。一种典型的情况是,我们在启动一个对话框或者初始化一个ViewPart时,我们会启动一些 Job去完成一些数据读取的工作,一旦数据读取结束,我们会启动新的UI Job更新相应的UI。有时,用户在打开对话框或者View后,马上关闭了该对话框或者View。这时我们启动的线程并没有被中断,一旦在Job中再去更 新UI,就会出错。在我们的代码中必须作相应的处理。所以,我们在线程中更新界面元素之前,我们必须先检查相应的控件是否已经被dispose了

结束语

在我们进行基于Eclipse的客户端开发时,使用多线程可以大大的提供我们的程序并发处理能力,同时对于提高用户体验也有很好的帮助。但是,多线程程序也有其不利的一面,我们也不要滥用线程:

首先,多线程程序会大大的提高我们程序的复杂度,使得我们的开发和调试更加困难 其次,过多的线程容易引发死锁、数据同步等并发问题的发生 另外,由于线程创建和销毁需要开销,程序的整体性能可能因为过多线程的使用而下降

所以,我们在使用线程时一定要谨慎。本文对Eclipse线程的讨论,希望能对大家使用线程有所帮助。由于实际情况较为复杂,文中所提到的方法仅供参考,读者对于不同的实际问题需要进行具体分析,从而找出最佳的解决方案。

热点排行