while循环和队列的奇怪java行为
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了while循环和队列的奇怪java行为,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1429字,纯文字阅读大概需要3分钟。
内容图文
我有while(true)循环的奇怪行为.这是代码:
作为班级成员,我有:
static Queue<Object> response = new LinkedList<Object>();
……和一个功能:
private void read() {
while (true)
{
System.out.println("foo");
if(!(response.isEmpty()))
{
if((Boolean)response.peek() == true)
{
view.dispose();
LogInControler controler= new LogInControler();
disableMasterLogin();
response.poll();
return;
}
else if((Boolean)response.poll() == false)
{
JOptionPane.showMessageDialog(view.getRootPane(),
"Wrong username or password.");
view.tfUsername.requestFocus();
return;
}
}
}
}
当从服务器(通过Socket)接收到对象时,InputController类将该对象传递给适当的控制器,在本例中为MasterLogInController并将其放入Queue响应中.
我在while(true)循环中等待响应,但问题是如果我删除“System.out.printline(”foo“);”循环只会输入一次!?使用这个syso行,我“强制”while循环执行循环,直到收到响应.这有什么不对?
解决方法:
我假设你有几个线程在运行.
System.out.println创建了一个内存屏障,可能会帮助您的代码看到一些不可见的变量(因为缺少同步).
特别是,您的队列不是线程安全的,似乎安全发布.因此可以想象:
>你的while循环可能会看到响应为null ==>空指针异常
> reponse.isEmpty()可能会返回false,但是response.peek()可能会返回null,然后在你的条件中转换为布尔值和unbox if((Boolean)xxx == true)==>空指针异常
>等
除了评论中给出的有助于理解原因的合理建议外,您还应该使代码线程安全.例如,您可以使用thread safe BlockingQueue.但这可能是不够的(因为您的各种if / if / else if语句的布局方式以及队列可能被每个语句之间的另一个线程更改的事实).
内容总结
以上是互联网集市为您收集整理的while循环和队列的奇怪java行为全部内容,希望文章能够帮你解决while循环和队列的奇怪java行为所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。