0

使用Java,有没有办法引用一个方法并动态生成一个线程?

例如,如果您调用了一个方法,该方法spawn()将采用另一个方法引用的参数,然后它会产生一个运行所引用方法的线程。我想代码看起来像:

void spawn(**wayToReferenceANumberOfDifferentMethods currentMethodToLaunch**) {
    new Thread(){
        public void run() {
            // **way to launch the currentMethodToLaunch**
        }
    }.start();
}

为了使上述工作,我想我需要能够引用一种method. 如果这不可能,为什么会这样?

4

3 回答 3

5

严格来说?不,Java 不是函数式语言,方法不是对象,不能作为参数传递。

但是,这种一般行为可以通过 anExecutorServiceRunnable/ Callables 来完成。

查看ExecutorService的 java 文档。

编辑

此外,可以使用各种框架抽象异步执行。例如,在 Spring 框架中使用 @Async 注解。

于 2013-09-27T04:18:18.883 回答
1

您可以将实现 Runnable 的对象传递给 spawn 方法。

void spawn(Runnable myRunnable) {
    Thread thread = new Thread(myRunnable); 
    thread.start();
}

你可以有多个实现 Runnable 接口的类,每个类做不同的事情。您传递给 spawn 方法的对象将确定其中哪一个将实际运行。

下面是实现 Runnable 的类的样子:

public class MyClass implements Runnable 
{   
  public void run()     
  {
     // do what you need here
  }
} 

在 Java 8 之前,接口被用来“传递方法”,如上所述。在 Java 8 中,您拥有 Lambda 表达式,可以更好地模拟这种行为。

于 2013-09-27T04:27:48.407 回答
0

正如其他答案所表明的那样,您可能只想传入Runnables 或Callables 并将它们用作执行该方法的基础。

但是,如果您真的想传递方法,则可以使用反射 API来完成此操作。这有点麻烦,但绝对可行。

public void spawn(final Method callme, final Object objectThatMethodIsAMemberOf, final Object...args) {
  new Thread() {
    @Override
    public void run() {
      try {
        callme.invoke(objectThatMethodIsAMemberOf, args);
      } catch(Exception e) {
        // A bunch of things can go wrong for example
        // you call the method on the wrong type of object
        // you supply the wrong number and/or type of arguments
        // the method is private and you don't have permission to call it
        // the method runs, but throws an exception
        // probably some more that I'm forgetting
      }
    }
  }.start()
}
于 2013-09-27T04:50:22.093 回答