我有一大堆的程序,需要执行连续,直到他们的所有执行,或者有某些条件得到满足。这里的基本码,需要加以执行,直到一个条件得到满足:

public boolean search()
{
    robot.go();

    robot.spin();

    //etc - around 8 more similar commands (each takes around 2 seconds)
    return false; //didn't find what it was looking for
}

迄今为止,只有这样,我想做什么的我想是这样的:

public boolean search()
{
    robot.go(false);
    while(robot.isMoving())
    {
        if(thingFound())
        {
            robot.stop()
            return true;
        }
        Thread.yield();
    }

    robot.spin(false);
    while(robot.isMoving())
    {
        if(thingFound())
        {
            robot.stop()
            return true;
        }
        Thread.yield();
    }


    //etc - around 8 more similar commands
    return false; //didn't find what it was looking for
}

false 参数 go()spin() 表示他们应该立即返回,从而允许的条件进行检查。然而,这种方式袭击我,而不是效率低下,作为同一块代码必须重复10次。这可能是实现更有效地使用例外或并发的线?

有帮助吗?

解决方案

根据乔纳森·莱弗勒的答案

:点击 可以使用一个可运行为指针到的命令

private final Runnable going = new Runnable() {
    @Override
    public void run() {
        robot.go(false);
    }
});

private final Runnable spinning = new Runnable {
    @Override
    public void run() {
        robot.spin(false);
    }
});

// other commands 


private boolean isFoundAfter(Runnable command)
{
    command.run();
    while (robot.isMoving())
    {
        if (thingFound())
        {
            robot.stop()
            return true;
        }
        Thread.yield();
    }
    return false;
}

public boolean search()
{
    if (isFoundAfter(going)) return true;

    if (isFoundAfter(spinning)) return true;   

    //etc - around 8 more similar commands
    return false; //didn't find what it was looking for
}

,点击 一个进一步的步骤中,如果合适,就把命令在数组或列表并执行它作为脚本

...

private boolean executeSearch(Runnable... commands)
{
    for (Runnable cmd : commands) {
        if (isFoundAfter(cmd)) return true;
    }
    return false; //didn't find what it was looking for
}

public boolean search() {
    return executeSearch(going, spinning /* around 8 more similar commands */);
}

其他提示

不知道为什么你正在使用Thread.yield() - 有没有执行,你没有提到其他线程?或者,也许我看错了问题。

我想也许Command模式可以在这里工作。你将不得不与RobotCommand方法execute接口,以及每个命令的类型(去,旋转等)RobotCommand的实现。然后,你可以构造一个RobotAlgorithm作为ListRobotCommand,并有一个遍历该列表的方法executeRobotAlgorithm,以调用每个execute RobotCommand各一个检查thingFound()的结果。

修改 - 哦,我想我明白了。别gospin开球那个改变机器人的状态的线程,或类似的东西?

修改2 - 响应您的评论,这听起来像这里的问题是,你需要能够如果机器人发现什么它寻找立即返回,但gospin,等命令将不是现在这样做的权利,你需要保持在此期间执行新命令的能力。所以,我可以做什么这里是有两个线程 - 一个将是一个“执行”的线程将执行您的Lists一个接一个的RobotCommand和“守望者”的线程将反复睡眠和民意调查(检查thingFound())。如果thingFound()是有史以来真,那么你可以停止你的机器人,以及执行人线程,或者如果执行到达结束前thingFound()是真的,那么它可以作为信号,(如有必要)。

显然,while循环可以打包成其自身的功能:

private boolean isFound()
{
    while (robot.isMoving())
    {
        if (thingFound())
        {
            robot.stop()
            return true;
        }
        Thread.yield();
    }
    return false;
}

public boolean search()
{
    robot.go(false);
    if (isFound()) return true;

    robot.spin(false);
    if (isFound()) return true;   

    //etc - around 8 more similar commands
    return false; //didn't find what it was looking for
}

(如果条件被分割为两行我不介意;我可能会做,在生产代码)

有一个更好的Java程序员比我能告诉你是否可以通过(C编程方面的函数指针,)“程序”周围。 我怀疑你可以,但我不知道语法和规则。的的证据似乎是你不能(大约2004年,反正)。

机器人可以使用条件的对象向信号器,这是完成了一些子的任务或进入了一个新的状态:

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/Condition.html

有趣的、对于环境的就是在你大概可以使用和 通知()等() 而不是更灵活的条件。控制器可能等待()直至机器人决定释放他通知().

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top