Java动态方法线程产生

时间:2013-09-27 04:12:52

标签: java multithreading methods

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

例如,如果你有一个名为spawn()的方法,它将获取另一个方法引用的参数,然后它将产生一个运行引用方法的线程。我想代码看起来像是:

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

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

3 个答案:

答案 0 :(得分:5)

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

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

查看ExecutorService的java文档。

修改

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

答案 1 :(得分: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表达式,这样可以更好地模拟此行为。

答案 2 :(得分:0)

正如其他答案所示,您可能只想传入RunnableCallable并使用这些作为执行方法的基础。

但是,如果你真的想要传递方法,那么你可以使用Reflection 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()
}