java – Swing在生成单独的线程时冻结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Swing在生成单独的线程时冻结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1984字,纯文字阅读大概需要3分钟。
内容图文
![java – Swing在生成单独的线程时冻结](/upload/InfoBanner/zyjiaocheng/784/5c5b0b09ab6a49b58c96b039c1830882.jpg)
为什么这段代码会冻结我的Swing应用程序? Swing组件与InfiniteLoop线程位于一个单独的线程中.如果我在每次打印之前在run()方法中引入sleep,那么程序运行正常.有人有任何线索吗?
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI(); // <-- creates the swing frame and component
}
});
Thread t = new Thread(new InfiniteLoop());
t.start();
}
public class InfiniteLoop implements Runnable
{
private static Logger logger = Logger.getLogger(InfiniteLoop.class);
public void run()
{
while(true)
{
log.info("test");
}
}
}
解决方法:
这里的答案与Java的线程调度实现(或者更确切地说,是平台的Java线程调度实现的细节)有关.大多数Java线程实现最终运行一个给定的线程(在给定的优先级),直到线程进入等待状态.然后运行该优先级中的下一个线程,等等……请注意,JVM规范没有指定确切的行为 – 这取决于JVM实现者的决定.
您可能需要考虑删除工作线程的优先级,而不是将睡眠插入到工作线程中.睡觉线程会起作用,但要记住这样做会很麻烦,并且它会迫使工作线程花费更长的时间来做事情.如果最后插入睡眠调用,请执行0毫秒(这足以释放线程,但如果没有其他线程处于活动状态,则应立即返回执行).
这里有一个描述这个的an article.
作为一个潜在的改进:invokeLater()调用可能最终将runnable放在一个永远没有机会出队的队列中,因为你的后台线程占用了所有的CPU.一个有趣的实验是将后台线程的启动移动到Runnable中 – 这将使EDT有机会在后台线程开始消耗CPU之前进行初始化.
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI(); // <-- creates the swing frame and component
Thread t = new Thread(new InfiniteLoop());
t.start();
}
});
}
甚至:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Thread t = new Thread(new InfiniteLoop());
t.start();
createAndShowGUI(); // <-- creates the swing frame and component
}
});
}
我实际上对这个结果很感兴趣(对实际测试不感兴趣,但是:-)).我在网上看到的一些参考文献说默认情况下EDT以更高的优先级运行(在这种情况下,EDT本身不应该出现饥饿).如果从EDT内部启动后台线程,Swing接口是否仍然保持响应?
内容总结
以上是互联网集市为您收集整理的java – Swing在生成单独的线程时冻结全部内容,希望文章能够帮你解决java – Swing在生成单独的线程时冻结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。