没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2009-11-13 14:05:52.000|阅读 884 次
概述:SwingAPI的设计目标是强大、灵活和易用。非凡地,我们希望能让程序员们方便地建立新的Swing组件,不论是从头开始还是通过扩展我们所提供的一些组件。出于这个目的,我们不要求Swing组件支持多线程访问。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
SwingAPI的设计目标是强大、灵活和易用。非凡地,我们希望能让程序员们方便地建立新的Swing组件,不论是从头开始还是通过扩展我们所提供的一些组件。出于这个目的,我们不要求Swing组件支持多线程访问。相反,我们向组件发送请求并在单一线程中执行请求。本文讨论线程和Swing组件。目的不仅是为了帮助你以线程安全的方式使用SwingAPI,而且解释了我们为什么会选择现在这样的线程方案。本文包括以下内容:
单线程规则:Swing线程在同一时刻仅能被一个线程所访问。一般来说,这个线程是事件派发线程。规则的例外:有些操作保证是线程安全的。事件分发:假如你需要从事件处理或绘制代码以外的地方访问UI,那么你可以使用SwingUtilities类的invokeLater要求在事件派发线程中执行某些代码。这个方法会立即返回,不会等待代码执行完毕。invokeAndWait行为与invokeLater类似,除了这个方法会等待代码执行完毕。一般地,你可以用invokeLater来代替这个方法。下面是一些使用这几个API的例子。请同时参阅《TheJavaTutorial》中的“BINGOexample”,尤其是以下几个类:CardWindow、ControlPane、Player和OverallStatusPane。
使用invokeLater方法你可以从任何线程调用invokeLater方法以请求事件派发线程运行特定代码。你必须把要运行的代码放到一个Runnable对象的run方法中,并将此Runnable对象设为invokeLater的参数。invokeLater方法会立即返回,不等待事件派发线程执行指定代码。这是一个使用invokeLater方法的例子:
RunnabledoWorkRunnable=newRunnable
};
SwingUtilities.invokeLater;使用invokeAndWait方法invokeAndWait方法和invokeLater方法很相似,除了invokeAndWait方法会等事件派发线程执行了指定代码才返回。在可能的情况下,你应该尽量用invokeLater来代替invokeAndWait。假如你真的要使用invokeAndWait,请确保调用invokeAndWait的线程不会在调用期间持有任何其他线程可能需要的锁。
这是一个使用invokeAndWait的例子:
voidshowHelloThereDialogthrowsException
};
SwingUtilities.invokeAndWait;
}
类似地,假设一个线程需要对GUI的状态进行存取,比如文本域的内容,它的代码可能类似这样:
voidprintTextField
throwsException
};
SwingUtilities.invokeAndWait;
System.out.println;}
假如你能避免使用线程,最好这样做。线程可能难于使用,并使得程序的debug更困难。一般来说,对于严格意义下的GUI工作,线程是不必要的,比如对组件属性的更新。不管怎么说,有时候线程是必要的。下列情况是使用线程的一些典型情况:执行一项费时的任务而不必将事件派发线程锁定。例子包括执行大量计算的情况,会导致大量类被装载的情况,和为网络或磁盘I/O而阻塞的情况。重复地执行一项操作,通常在两次操作间间隔一个预定的时间周期。要等待来自客户的消息。你可以使用两个类来帮助你实现线程:SwingWorker:创建一个后台线程来执行费时的操作。Timer:创建一个线程来执行或多次执行某些代码,在两次执行间间隔用户定义的延迟。使用SwingWorker类SwingWorker类在SwingWorker.java中实现,这个类并不包含在Java的任何发行版中,所以你必须单独下载它。SwingWorker类做了所有实现一个后台线程所需的肮脏工作。虽然许多程序都不需要后台线程,后台线程在执行费时的操作时仍然是很有用的,它能提高程序的性能观感。
SwingWorkersanexampleofusingSwingWorker:要使用SwingWorker类,你首先要实现它的一个子类。在子类中,你必须实现construct方法还包含你的长时间操作。当你实例化SwingWorker的子类时,SwingWorker创建一个线程但并不启动它。你要调用你的SwingWorker对象的start方法来启动线程,然后start方法会调用你的construct方法。当你需要construct方法返回的对象时,可以调用SwingWorker类的get方法。这是一个使用SwingWorker类的例子:
...//在main方法中:
finalSwingWorkerworker=newSwingWorker
};
worker.start;
...
//在动作事件处理方法中:
JOptionPane.showMessageDialog)
当程序的main方法调用start方法,SwingWorker启动一个新的线程来实例化ExpensiveDialogComponent。main方法还构造了由一个窗口和一个按钮组成的GUI。当用户点击按钮,程序将阻塞,假如必要,阻塞到ExpensiveDialogComponent创建完成。然后程序显示一个包含ExpensiveDialogComponent的模式对话框。你可以在MyApplication.java找到整个程序。使用Timer类Timer类通过一个ActionListener来执行或多次执行一项操作。你创建定时器的时候可以指定操作执行的频率,并且你可以指定定时器的动作事件的监听者。启动定时器后,动作监听者的actionPerformed方法会被调用来执行操作。定时器动作监听者定义的actionPerformed方法将在事件派发线程中调用。这意味着你不必在其中使用invokeLater方法。这是一个使用Timer类来实现动画循环的例子:
publicclassAnimatorApplicationTimer
extendsJFrameimplementsActionListener
publicvoidstartAnimationelse
}
publicvoidstopAnimation
publicvoidactionPerformed
...
}
在一个线程中执行所有的用户界面代码有这样一些优点:组件开发者不必对线程编程有深入的理解:像ViewPoint和Trestle这类工具包中的所有组件都必须完全支持多线程访问,使得扩展非常困难,尤其对不精通线程编程的开发者来说。最近的一些工具包如SubArctic和IFC,都采用和Swing类似的设计。事件以可预知的次序派发:invokeLater排队的runnable对象从鼠标和键盘事件、定时器事件、绘制请求的同一个队列派发。在一些组件完全支持多线程访问的工具包中,组件的改变被变化无常的线程调度程序穿插到事件处理过程中。这使得全面测试变得困难甚至不可能。更低的代价:尝试小心锁住临界区的工具包要花费实足的时间和空间在锁的治理上。每当工具包中调用某个可能在客户代码中实现的方法时,工具包都要保存它的状态并释放所有锁,以便客户代码能在必要时获得锁。当控制权交回到工具包,工具包又必须重新抓住它的锁并恢复状态。所有应用程序都不得不负担这一代价,即使大多数应用程序并不需要对GUI的并发访问。这是的SubArcticJavaToolkit的对在工具包中支持多线程访问的问题的描述:我们的基本信条是,当设计和建造多线程应用程序,尤其是那些包括GUI组件的应用程序时,必须保证极端小心。线程的使用可能会很有欺骗性。在许多情况下,它们表现得能够极好的简化编成,使得设计“专注于单一任务的简单自治实体”成为可能。在一些情况下它们的确简化了设计和编码。然而,在几乎所有的情况下,它们都使得调试、测试和维护的困难大大增加甚至成为不可能。无论大多数程序员所受的练习、他们的经验和实践,还是我们用来帮助自己的工具,都不是能够用来对付非决定论的。例如,全面测试在bug依靠于时间时是几乎不可能的。尤其对于Java来说,一个程序要运行在许多不同类型的机器的操作系统平台上,并且每个程序都必须在抢先和非抢先式调度下都能正常工作。由于这些固有的困难,我们力劝你三思是否绝对有使用线程的必要。尽管如此,有些情况下使用线程是必要的,所以subArctic提供了一个线程安全的访问机制。本章讨论了这一机制和怎样在一个独立线程中安全地操作交互树。他们所说的线程安全机制非常类似于SwingUtilities类提供的invokeLater和invokeAndWait方法。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号