我可以从函数返回一个值并让函数继续运行代码

时间:2011-08-26 11:21:01

标签: java

我正在实现一个接口。

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

问题是B需要很长时间才能运行,而C需要它返回运行值。理想情况下,我会将B分成B和D并将所有C不需要进入的东西放入D.这是不可能的,我想知道是否有可能从B返回一个值,所以C可以运行但之后有B运行更多代码。

无法从B调用C.

2 个答案:

答案 0 :(得分:1)

你可以让B安排长时间运行的任务在另一个线程(例如Timer或Executor)上执行,然后返回值,而不必等待长时间运行的任务完成。

答案 1 :(得分:1)

A必须致电BC您希望B进行一些处理,C进行调用,B继续处理

最简单的方法是

AB上调用了一个方法,该方法打开文件并进行一些处理,并保留以后需要打开的任何内容。 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);
    }
});