2013-09-27 45 views
0

使用java,有没有一种方法来引用一个方法,并已动态产生到一个线程?Java动态方法线程产生

例如,如果您有一个名为spawn()的方法,它将采用另一个方法引用的参数,然后它会产生一个将运行引用方法的线程。我想象中的代码看起来是这样的:

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

为了上述的工作,我想我需要能够引用的method一个类型。如果这是不可能的,为什么将不胜感激的快速描述。

+1

你想要做什么,要求函数/方法被视为语言中的第一类对象。这意味着你可以声明一个函数并将它作为参数传递给另一个函数。 Java不支持这一点。 在java中8然而可以传递与lambda表达式的功能的内联体:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html – ylabidi

回答

5

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

然而,这种一般行为可以用ExecutorServiceRunnable/Callables来完成。

看一看的Java文档的ExecutorService

编辑

而且,有可能使用各种框架抽象异步执行。例如,在Spring框架中使用@Async注释。

1

可以传递实现可运行到产卵方法的对象。

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表达式,从而更好地模拟此行为。

+0

我是大约的方法告诫说只是产生可能无限数量的匿名线程,并让它们在运行时间中松动。你应该使用一个执行器服务来跟踪它们,这使得优雅的关机变得更直接。 – Aurand

+0

@Aurand - 这是一个完全不同的考虑因素,这不一定是由OP询问的。无论您使用执行者服务还是单个线程都是基于许多因素的决定。如果不知道这是什么用途,将其作为最适合执行者服务的任务宣布是非常不成熟的。另外,OP正在运行一个线程,所以我尽可能保持它与他的代码类似。 – stepanian

0

正如其他答案已经表明你可能只想通过Runnable s或Callable s并将其用作执行该方法的基础。

但是,如果你真的想绕过方法比你可以使用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() 
} 
+0

这在技术上等同于传递此方法所属对象的实例并调用它。他的问题更多地提到了传递函数的可能性,而不必将它们绑定到一个类,就像在纯粹的函数式语言或对功能范式具有体面支持的语言中一样。 – ylabidi