我有一堆程序需要连续执行,直到它们全部执行或满足某个条件。以下是满足条件之前需要执行的基本代码:
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
}
go()
和 spin()
的 false
参数表示它们应该立即返回,从而允许检查条件。然而,这种方法让我觉得效率相当低,因为同一个代码块必须重复 10 次。通过异常或并发线程可以更有效地实现这一点吗?
最佳答案
不确定为什么要使用Thread.yield()
- 是否还有其他您没有提到的线程正在执行?或者也许我误解了这个问题。
我想也许命令模式可以在这里工作。您将拥有一个带有 execute
方法的 RobotCommand
接口(interface),以及每个命令类型(go、spin 等)的 RobotCommand
实现。然后,您可以将 RobotAlgorithm
构造为 RobotCommand
的 List
,并使用一个方法 executeRobotAlgorithm
迭代该列表,在每个 RobotCommand
上调用 execute
并在每次调用后检查 thingFound()
的结果。
编辑 - 哦,我想我明白了。 go
和 spin
是否启动改变机器人状态的线程,或者类似的事情?
编辑 2 - 作为对您评论的回应,听起来这里的问题是,如果机器人找到它正在寻找的东西,您需要能够立即返回,但是 go
、spin
等命令现在无法执行此操作,您需要能够同时继续执行新命令。所以我在这里可能要做的是有两个线程 - 一个是“执行器”线程,它将一一执行您的 RobotCommand
的 List
,另一个是“观察者”线程将重复 sleep 和轮询的线程(检查 thingFound()
)。如果 thingFound()
为 true,那么您可以停止机器人以及执行程序线程,或者如果执行程序在 thingFound()
为 true 之前到达末尾,那么它可以发出这样的信号(如果需要)。
关于java - 如何中断 Java 中的一系列程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2034520/