首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >空循环可以使用吗?

空循环可以使用吗?
EN

Stack Overflow用户
提问于 2014-07-05 07:10:00
回答 2查看 77关注 0票数 0

我正在开发一个基于文本的游戏,使用GUI作为输入和输出的“控制台”。我的目标是,当游戏需要它时,将我输入的JTextArea命令提交给另一个方法。

为此,我提出了这样的想法:当user.readLine()被调用时,它会循环,直到图形用户界面接收到一个操作事件。此事件的检测是通过翻转名为commanded的布尔值来完成的,该布尔值在actionevent的方法中切换。然后,readLine()在此时中断循环并返回刚刚输入的文本,然后将布尔值反转回来。有趣的是,只有当我在反转布尔值之前添加一个System.out.println();Thread.sleep(1);时,这才能起作用……

readLine()方法包含大量循环,在等待Action事件时,大括号之间没有代码。认为这是一种“短路”和应该避免的东西是错误的吗?代码如下。谢谢!

CommandInput.java:

代码语言:javascript
复制
public void waitForCommand() {
    try {
        processCommand(Parasite.user.readLine().toLowerCase());
    } catch (Exception e) {
        System.err.println(e);
    }
}

UI.java (初始化为Parasite.user):

代码语言:javascript
复制
boolean commanded= false;
String command = "";

public final String readLine()
{
    while(commanded == false)
    {
       System.err.print(command);
    }
    System.out.println("Submitting Command");
    commanded = false;
    return command;       
}

private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {                                            

    commanded=true;
    command=jTextField1.getText();
    System.err.println(jTextField1.getText());  
    jTextField1.setText("");

} 
EN

回答 2

Stack Overflow用户

发布于 2014-07-05 07:26:54

短路的事情:除了像这样的循环之外,循环不会做太多的事情:

代码语言:javascript
复制
while(true) {}

对CPU不是很友好,最好是这样:

代码语言:javascript
复制
while(true) {
    Thread.yield();
}

这告诉CPU,这个线程可以立即停止,所以其他线程现在可以运行,它在线程队列中向下移动。这样做不会损失太多的精度,但它会阻止您使用所有的cpu。(查看此处了解更多信息:http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield() )

所以在你的例子中:

代码语言:javascript
复制
while(commanded == false)
{
   System.err.print(command);
    Thread.yield();
}
票数 1
EN

Stack Overflow用户

发布于 2014-07-05 07:36:26

阅读this文章,了解如何使用事件驱动编程来解决您的问题。简而言之,您的方法效率低下,伸缩性不好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24581548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档