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

 我来答
黑科技1718
2022-11-04 · TA获得超过5872个赞
知道小有建树答主
回答量:433
采纳率:97%
帮助的人:81.7万
展开全部

   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线程的讨论 希望能对大家使用线程有所帮助 由于实际情况较为复杂 文中所提到的方法仅供参考 读者对于不同的实际问题需要进行具体分析 从而找出最佳的解决方案

lishixinzhi/Article/program/Java/gj/201311/27702

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式