怎么我可以中断一个顺序的程序Java?
-
19-09-2019 - |
题
我有一大堆的程序,需要执行连续,直到他们的所有执行,或者有某些条件得到满足。这里的基本码,需要加以执行,直到一个条件得到满足:
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
作为List
的RobotCommand
,并有一个遍历该列表的方法executeRobotAlgorithm
,以调用每个execute
RobotCommand
各一个检查thingFound()
的结果。
修改 - 哦,我想我明白了。别go
和spin
开球那个改变机器人的状态的线程,或类似的东西?
修改2 - 响应您的评论,这听起来像这里的问题是,你需要能够如果机器人发现什么它寻找立即返回,但go
,spin
,等命令将不是现在这样做的权利,你需要保持在此期间执行新命令的能力。所以,我可以做什么这里是有两个线程 - 一个将是一个“执行”的线程将执行您的List
s一个接一个的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
有趣的、对于环境的就是在你大概可以使用和 通知() 和 等() 而不是更灵活的条件。控制器可能等待()直至机器人决定释放他通知().