Java 我可以从函数返回一个值并让函数保持运行代码吗

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安排长时间运行的任务在另一个线程(如计时器或执行器)上执行,然后返回值,而不必等待长时间运行的任务

我正在实现一个接口

我有两个函数,我必须实现A和B。A检查文件是否损坏并返回,然后B处理文件并返回。在B返回函数C运行之后,我无法控制C,因为我只是实现了A和B

问题是B需要很长时间才能运行,而C需要它返回值才能运行。理想情况下,我会将B分为B和D,并将C不需要运行的所有内容放入D。因为这是不可能的,我想知道是否有可能从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);
    }
});