我正在实现一个接口。
我有两个函数,我必须实现A和B.检查文件是否已损坏并返回然后B处理文件并返回。在B返回函数C运行之后,我无法控制C,因为我只是实现了A和B.
问题是B需要很长时间才能运行,而C需要它返回运行值。理想情况下,我会将B分成B和D并将所有C不需要进入的东西放入D.这是不可能的,我想知道是否有可能从B返回一个值,所以C可以运行但之后有B运行更多代码。
无法从B调用C.
答案 0 :(得分:1)
你可以让B安排长时间运行的任务在另一个线程(例如Timer或Executor)上执行,然后返回值,而不必等待长时间运行的任务完成。
答案 1 :(得分:1)
A
必须致电B
和C
您希望B
进行一些处理,C
进行调用,B
继续处理
最简单的方法是
A
在B
上调用了一个方法,该方法打开文件并进行一些处理,并保留以后需要打开的任何内容。 A
调用C
,然后调用B
上的另一个方法完成处理。这意味着B
必须知道何时停止并返回,因此可以调用C
。
解决这个问题的方法是使用下面的监听器接口。
class A {
void method(B b, C c) {
b.function(new Listener() {
public void onValue(long num) { // or any event type
if (num > 100) C.something();
}
});
}
}
这种方式B
不知道何时会调用C
。
您可以实现一个传递给函数的侦听器接口,它可以“返回”多个值。但是,一旦函数实际return
s,它就不再运行了。
此函数可以在另一个线程或同一个线程中运行。
interface Listener {
public void onValue(long num);
public void onError(Exception e);
public void onEndOfData();
}
public void function(Listener l) {
try {
for(int i=0;i<10;i++) l.onValue(i);
// read a file
} catch (Exception e) {
l.onError(e);
} finally {
l.onEndOfData();
}
}
换句话说而不是像
那样做// only one value.
long value = function();
System.out.println("value returned was "+value);
你可以做到
// any number of values can be returned
// and the function can keep processing.
function(new Listener() {
public void onValue(long value) {
System.out.println("value returned was "+value);
}
});