首页 | 软件中心 | Designand Inspiration
读库教程网 > 网络教程 > 技术开发 > Java > JavaSwing线程死锁疑难剖析

JavaSwing线程死锁疑难剖析

添加:2010年6月17日


  在基于Java Swing举行图形界面开发的时分,经常遇到的就是Swing多线程疑问。我们能够想想一下,假设须要在一个图形界面上显示很非少数据,这些数据是经历长时间、庞杂的查询和运算得到的。假设在图形界面的同一个线程中举行查询和运算任务则会招致一段时间界面处于死机形态,这会给用户带来不良的互动体会。为了处置这个疑问,普通会单独启动一个线程举行运算和查询任务,并随时更新图形界面。这时分,另一个疑问就出现了,能够不只没有处置原来偶然死机疑问,还能够招致顺序全面死掉。幸运的是在JDK中隐藏了一个中缀顺序的快捷键,就是CTRL+BREAK,这个快捷键Sun并没有在文档中揭晓。假设在命令行方式下启动Java顺序,然后按CTRL+BREAK键,会得到堆栈的跟踪信息。从这些跟踪信息中就能够知晓详细引发死机的位置了。
  当一个顺序发生死锁的时分,你必须会期盼尽快找到原由并且处置它。这时分,你普通的元气会用在查找引发死锁的位置,另一半的元气会用于对堆栈举行跟踪一确定引发死锁的原由。但是在Java Swing顺序中,你的一切全力能够都是没有价值的。这是由于Java对Swing的多线程编程有一个特殊要求。就是在Swing里,只好在与Swing 类似的线程里对GUI元件举行修正。
  也就是说,假设你要执行类似于jLabel1.setText("blabla")代码,必需在Swing线程中,而不准许在其他线程当中。假设必需在其他线程中修正元件,能够运用类似一下方式处置:
SwingUtilities.invokeLater(new Runnable() {
      public void run() {
          jLabel1.setText("blabla"); 
     }
  }

  invokeLater办法虽然外表有时间延迟执行意思,但是实践上几乎没有任何影响,能够在几毫秒之内就会被执行。另外尚有一个invokeAndWait办法,除非特殊须要,否则几乎是不用的。
  在不运用invokeLater的情况下,招致刷新疑问是能够明白的,但是招致死锁就优点令人匪夷所思了。幸运的是,不是任什么时辰分都须要调用改办法,这是由于大非少数情况下,我们都是在与Swing同一个线程里举行界面更新。比如监听按钮点击事情的 ActionListener.actionPerformed办法就是运转在与Swing类似的线程中的。但是假设在回调类中引用了另一个类,并且是不属于AWT/Swing的,那么后果就很难确定了。所以说运用invokeLater应该是最安全的。
  须要留意的是,在 invokeLater做的任何事情,都会招致Swing线程窗口制作任务暂停下来,等候invokeLater任务完毕。所以不要在 invokeLater举行耗时操作,尽量只执行那些界面制作有关的任务。能够议决代码重构,将那些与界面更新有关的代码集中起来一致处置。
  一个建议是那些在Swing中运用的类举行合理的设计。代码执行前判别能不能处于Swing线程当中(运用 SwingUtilities.isEventDispatchThread()办法),假设不是,则须要议决 SwingUtilities.invokeLater(Runnable)执行,否则则直接执行代码。但是这说起来容易,但是实践操作会遇到许多难处。

读库教程网文章由网络收集后整理发布,文章发布人拥有该内容的所有权力及责任!

如果你喜欢这页,可以按Ctrl+D收藏起来。

相关内容
相关评论
公益广告
精彩推荐
友情链接: 百分百青年 | 烛光信息网 | 夏布新网 | 新育互联网
管理员:QQ:27038219, E-mail:27038219@qq.com今日更新
读库教程网所有文章从网络收集所发布,文章发布人拥有该内容的所有权力及责任,转载时请注明出处!
Template designed by www.dkuu.com. Optimized for 1024x768 to Firefox,Opera and MS-IE6/IE7.