我想知道是否有办法通过执行功能来持续检查条件。换句话说,无论何时满足条件,我都能够return
,无论我目前在执行函数的哪个位置。这基本上就像我在我的每一行功能之后都有if
条件一样。
上下文如下:我有一个线程流式传输一些数据。当它在后台加载时,用户可以要求获取一些其他数据(这会改变布尔标志的状态)。在这种情况下,线程必须停止它正在做的任何事情,考虑新请求并重新开始。另一个限制是我不能杀死这个线程并创建一个新线程。
正如您可能猜到的,数据加载函数包含for
循环。因此,一个直截了当的想法是在每次迭代时检查我的布尔标志。这就是我到目前为止所做的。不幸的是,每次迭代都包含很多指令并且相当时间。因此,在开头设置if
语句不够好,因为它会在修改标志值和return
之间产生明显的延迟。
我正在考虑使用try/catch
开销和一个手动定义的异常,只要我的条件满足就会抛出,但是从我到目前为止所读到的它被认为是不好的做法。
你会用什么来创造这个"连续如果"行为?
答案 0 :(得分:2)
绝对没有办法隐含地这样做:Java没有"魔法"将控制转移到检查条件的代码的方法;所有检查必须由您的程序代码明确执行。
在您的情况下,这意味着您的for
循环需要显式检查boolean
变量的状态,并在状态发生变化时退出:
for (int i = 0 ; !mustExit && i != lengthOfItemsToStream ; i++) {
doSomeWork();
if (mustExit) break; // Check the boolean flag
doAdditionalWork();
if (mustExit) break; // Check the boolean flag
doEvenMoreWork();
}
答案 1 :(得分:0)
将您的线程划分为检查点。然后将其与寻找用户输入的类似线程同步。当两个线程在检查点相遇(内存屏障可能?)时,它们会执行关键操作,然后继续前进。
您可以在循环中创建此类检查点,但开销可能很糟糕。
答案 2 :(得分:0)
您可以尝试使用while(1)循环,该循环在满足要求时中断。
while(1){
....statements...
if(requirementIsMet){ break; }
}
或者只使用@ sean3838
所说的递归theFunction(datatype param ){
if(baseCase){
//execution completed
}else{
theFunction(paramBrokenDown)}
}
答案 3 :(得分:0)
执行此操作的唯一方法是在另一个线程中运行for循环,然后在for循环线程上调用Thread.stop来终止它。但是,自1.5以来,Thread.stop已经被弃用了(参见http://docs.oracle.com/javase/8/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html),所以唯一可行的方法是在你的线程中添加更多if语句来检查它是否应该退出。
如果您拥有资源,可以使系统更具响应性。当你需要杀死你的线程时,设置告诉它退出的标志。然后,您可以启动一个新线程来考虑新输入并忽略第一个线程仍在执行的任何操作。然后,当你的第二个线程忙着做真正的工作时,它可以花费时间去死。
答案 4 :(得分:0)
看看Interrupts。您可以中断线程抛出new InterruptException()
并执行其他操作。您仍然需要在循环中检查thread.interrupted()
,这很难。
你的主题
class SimpleThread extends Thread {
int thisMuchData = 10;
public SimpleThread(String str, thisMuchData) {
super(str);
this.thisMuchData = thisMuchData;
}
public void run() {
for (int i = 0; i < thisMuchData; i++) {
getDataFor(i);
if (Thread.interrupted()) {
// We've been interrupted: no more crunching.
break;
}
}
System.out.println("DONE! " + getName());
}
void setHowMuchData(int thisMuchData){
this.thisMuchData = thisMuchData;
}
}
你的主要
public class MyClass{
Thread thread = new SimpleThread("my Thread", 10);
public static void main(String args[]){
thread.start();
}
public void canIhasMoreData(int thisMuchData){
thread.interrupt();
thread.setHowMuchData(thisMuchData);
thread.start();
}
}
NB:我还没有测试过,我是从头顶写的,这只是为了表达我的观点。
答案 5 :(得分:-3)
尝试使用递归,只需从函数内部调用函数。
编辑:
好的,显然我应该扩展我的答案......
private String functionName(String condition) {
if (check your condition here) {
return;
// or do whatever you have to do
}
// call your function again
functionName();
}