奇怪的Java问题,而循环终止

我有一段代码,如下所示:

Algorithm a = null; while(a == null) { a = grid.getAlgorithm(); }

信息getAlgorithm()在我的网格类返回这取决于用户从一些选项选择算法的某些亚型。

我的问题是,被选择的算法即使之后,循环从不终止。 然而,这不是有点棘手,如果我只是放置一个的System.out.println(“在这里得到了”); 我的呼叫信息getAlgorithm()后,程序运行完全正常,并按照预期的循环终止。

我的问题是:为什么还说神奇print语句突然让循环终止?

此外,这个问题首先来到了,当我开始使用我的新的笔记本电脑,我怀疑这是相关的,但我想这将是值得一提。

编辑:有问题的程序不是多线程的。 对于信息getAlgorithm()的代码是:

public Algorithm getAlgorithm () { return algorithm; }

凡算法最初是空的,但在某些用户的输入会改变的价值。

--------------解决方案-------------

你正在做积极投票。 这是一个不好的做法。 你至少应该让轮询线程睡眠(与视频下载)。 由于的println做一些IO,它可能就是这样做的。 如果您的应用程序不是多线程是不可能在所有的工作。

我相信这个问题必须处理grid.getAlgorithm是如何执行。 如果没有与执行方法相关的很少的成本,那么你的while循环周期非常快,只要方法继续返回null。 即通常被称为一个忙等待。

现在,这听起来像你的新笔记本电脑遇到饥饿问题,它并没有在旧计算机上体现。 这是很难说为什么,但如果你看看我上面包含的链接,维基百科的文章也表明,忙等待确实有不可预知的行为。 也许你的旧电脑处理用户IO比你的新的笔记本电脑更好。 无论如何,你的新的笔记本电脑,这个循环是从任何正在处理您的用户IO因此它被饿死的过程,是负责打破循环运作的资源,。

如果这个循环是一个图形用户界面,以等待用户输入,然后哎哟。 坏,坏主意,甚至与Thread.sleep()加入我从来没有推荐它。 相反,你很可能要注册有问题的组件上的事件侦听器,并且只验证代码断火时的内容变化。

它更可能你的程序锁定,因为你已经达到了某种形式的僵局比什么都重要,特别是如果你的应用是多线程的。 而不是试图解决这个问题,破解您的捷径可走的,我会认真考虑如何重新设计应用程序的工作的一部分。

您应该检查信息getAlgorithm(),必须有一些错误的方法。

有两种情况:

  1. 你的代码是真的不意味着是多线程的。 在这种情况下,你需要插入某种用户输入的循环。 否则,你还不如把它作为一个算法= grid.getAlgorithm(); 并防止无限循环。
  2. 你的代码是多线程在这种情况下,你有某种'知名度'的问题。 转到原子性,可视性和订购或阅读Java并发在实践中了解的知名度。 本质上,它意味着没有某种形式的线程之间的同步,你是循环中的线程可能永远也找不到了,该值由于优化的JVM可以进行改变。

你没有提到解决这个代码是如何运行的任何背景。 如果它是一个基于控制台应用程序,你从一家“主要”功能启动时,你会知道有没有多线程。 我假设,因为你说有没有多线程的,这是不是这样的。 另一种选择是,这是一个Swing应用程序在这种情况下,你应该阅读多线程Swing应用程序。 这可能是一个Web应用程序在这种情况下,类似的案件摆动可能适用。

在任何情况下,你总是可以调试应用程序,看看哪个线程写入'算法'变量,然后看哪个线程从中读取。

我希望这是有帮助的。 在任何情况下,如果你给你的问题​​多一点的情况下,你可能会发现更多的帮助。 特别是对于这样一个耐人寻味的标题作为一个问题“奇怪的Java问题,而循环终止”。

分类:java的 时间:2015-03-15 人气:0
本文关键词: java的,终止
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.016 (s). 10 q(s)