Java 我可以从函数返回一个值并让函数保持运行代码吗
我正在实现一个接口 我有两个函数,我必须实现A和B。A检查文件是否损坏并返回,然后B处理文件并返回。在B返回函数C运行之后,我无法控制C,因为我只是实现了A和B 问题是B需要很长时间才能运行,而C需要它返回值才能运行。理想情况下,我会将B分为B和D,并将C不需要运行的所有内容放入D。因为这是不可能的,我想知道是否有可能从B返回一个值,以便C可以运行,但之后让B运行更多代码Java 我可以从函数返回一个值并让函数保持运行代码吗,java,Java,我正在实现一个接口 我有两个函数,我必须实现A和B。A检查文件是否损坏并返回,然后B处理文件并返回。在B返回函数C运行之后,我无法控制C,因为我只是实现了A和B 问题是B需要很长时间才能运行,而C需要它返回值才能运行。理想情况下,我会将B分为B和D,并将C不需要运行的所有内容放入D。因为这是不可能的,我想知道是否有可能从B返回一个值,以便C可以运行,但之后让B运行更多代码 不能从B调用C。您可以让B安排长时间运行的任务在另一个线程(如计时器或执行器)上执行,然后返回值,而不必等待长时间运行的任务
不能从B调用C。您可以让B安排长时间运行的任务在另一个线程(如计时器或执行器)上执行,然后返回值,而不必等待长时间运行的任务完成。
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
您可以实现一个侦听器接口,将其传递给函数,它可以“返回”多个值。但是,一旦函数实际返回,它就不再运行 此函数可以在其他线程或同一线程中运行
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();
}
}
你能行
// 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);
}
});
听起来像是多线程的例子。@Kerrek如果我是多线程的,我就能保证C在B的另一半之前运行,因为如果它们并行运行,那就毫无意义了。如果我只实现和接口,我还可以实现多线程吗?我不理解你的规范。你说在你运行
x=B()的那一刻;C(x)代码>这很好,但是现在您想要拆分x=B1();C(x);B2()你说C()
必须在B2()
开始之前完成?那么最初的设置是如何正确的呢?我该怎么做呢?我不太擅长java,你能举个例子吗?我不明白你在说什么对不起:(对监听器的每次调用都是另一个“返回”到调用代码的值。请看我的编辑。我认为@Peter的意思是你的C将实现监听器接口(以及它的所有方法).在C中,依赖于B的代码应该放在onValue()方法中。调用B时必须传递“this”对于B类的那个函数。我希望我理解正确。@Naved我不能影响C。C是一个由服务器执行的函数,我无法控制它们是否希望尽快运行,但我的两个函数都在C之前运行。@Skeith,你想尽快运行,但不能先运行。你需要等待什么?
// 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);
}
});