Java程序设计教学课件作者刘慧宁14课件.pptVIP

Java程序设计教学课件作者刘慧宁14课件.ppt

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
14.8 线程安全的类(续) 第13章中介绍的集合类大多数不是线程安全的,虽然,类Vector、Hashtable和Stack是线程安全的,但它们已经过时。 为了将非线程安全的集合包装成线程安全的,类java.util.Collections中定义了6个相关静态方法。比如,下述语句就将一个ArrayList集合包装成线程安全的: ListInteger syncints = Collections.synchronizedList( new ArrayListInteger()); 对于这种集合,多线程编程时应该确保没有任何语句直接访问没有经过包装的原始集合,为了达到这一目的,最好的方法是确保不存在任何引用原始集合的引用。 14.8 线程安全的类(续) 这些包装而来的线程安全集合,在用于迭代时不是线程安全的,如果迭代过程中,另一个线程结构性改变了当前集合,系统会抛出异常。在这种情况下,程序中仍然需要显式进行同步。 多线程编程时,一般最好使用包java.util.concurrent中定义的集合类。包java.util.concurrent中定义的集合性能通常优于包装来的集合,而且它们用于迭代时是线程安全的。 不应将线程安全的类用于单线程编程。 14.9 Swing与线程 编写图形用户界面程序时,为了提高响应速度,如果程序中需要做某些耗时的工作,就应该启动一个新线程。 必须注意,绝大多数Swing组件不是线程安全的,如果同时在多个线程中直接操作这些Swing组件就有可能引起资源冲突。 14.9 Swing与线程(续) 前面编写的图形用户界面程序绝大多数也不是单线程的。Java系统执行它们时,会首先在主线程中创建初始用户界面,然后显示它们,用户界面第1次显示时,系统就会自动创建一个被称为事件分发线程的新线程,所有的事件处理都在该线程中依次进行。因此,初始用户界面显示后,如果主线程中还定义有直接操作Swing组件的代码,就有可能引起冲突,所以,主线程应该在显示初始用户界面后就退出,不应该在其中定义其他操作。 14.9 Swing与线程(续) 极个别复杂的Swing组件,即使是在它显示前操作它也会启动事件分发线程进行处理,因此,对于图形用户界面,即使只是使用主线程进行初始化,极端情况下也会引起资源冲突。 因此,如果在主线程中直接操作Swing组件,或者在其他非事件分发线程中直接操作Swing组件,就有可能引起资源冲突。 14.9 Swing与线程(续) 为了避免这种冲突,Java语言要求所有操作Swing组件的代码都在事件分发线程中执行。对于非事件分发线程,可以通过调用类javax.swing.SwingUtilities中定义的静态方法invokeLater或invokeAndWait向事件分发线程提交要执行的任务。其中,方法invokeLater将参数指定的任务添加到待执行事件队列中,并立即返回,之后,该任务和其他事件一起排队在事件分发线程执行;方法invokeAndWait的作用与invokeLater大致相同,不过,它提交任务时,需要等到该任务执行完毕后才返回。 14.9 Swing与线程(续) 一般来说,使用方法invokeLater更合理。但是,applet程序中,图形用户界面的初始化任务应该由方法init调用方法invokeAndWait来完成,否则就有可能出现图形用户界面还未初始化完成,方法init就已经返回,从而导致浏览器在加载该applet时出现问题的情况。 注意:不能在事件分发线程中调用方法invokeAndWait。 14.9 Swing与线程(续) 注意:每次调用方法invokeLater或invokeAndWait并不会创建新的事件分发线程,每个Java图形用户界面程序运行时,事件分发线程只有一个,它由系统自动创建,每次提交的任务都在同一个事件分发线程中排队依次执行,也正因为如此,如果所有操作Swing组件的代码都在其中执行,就可以避免资源冲突。 14.9 Swing与线程(续) import javax.swing.*; public class FrameDemo { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame(测试JFrame); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); frame.setSize(300, 100

您可能关注的文档

文档评论(0)

精品课件 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档