java

位置:IT落伍者 >> java >> 浏览文章

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


发布日期:2022年05月31日
 
Eclipse客户端程序中多线程的使用[6]

Job使用中要注意的问题

不要在Job中使用Threadsleep方法如果你想要让Job进入睡眠状态最好用Job的sleep方法虽然使用Threadsleep和Job的sleep方法达到的效果差不多但是它们实现的方式完全不同对系统的影响也不一样我们知道Eclipse中Job是由Eclipse的JobManager来管理的如果我们调用Job的sleep方法JobManager会将Job转入睡眠状态与其对应的线程也会重新放入线程池等待运行其他Job而如果我们在Job中直接调用Threadsleep方法它会直接使运行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 (!jobcancel())

jobjoin();

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

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

首先多线程程序会大大的提高我们程序的复杂度使得我们的开发和调试更加困难 其次过多的线程容易引发死锁数据同步等并发问题的发生 另外由于线程创建和销毁需要开销程序的整体性能可能因为过多线程的使用而下降 所以我们在使用线程时一定要谨慎本文对Eclipse线程的讨论希望能对大家使用线程有所帮助由于实际情况较为复杂文中所提到的方法仅供参考读者对于不同的实际问题需要进行具体分析从而找出最佳的解决方案

[] [] [] [] [] []

               

上一篇:Eclipse客户端程序中多线程的使用[1]

下一篇:Eclipse客户端程序中多线程的使用[5]