Java动态方法线程生成

Java动态方法线程生成,java,multithreading,methods,Java,Multithreading,Methods,使用Java,有没有一种方法可以引用一个方法并动态地生成一个线程 例如,如果您有一个名为spawn()的方法,它将接受另一个方法引用的参数,然后它将派生出一个线程,该线程将运行引用的方法。我想代码应该是这样的: void spawn(**wayToReferenceANumberOfDifferentMethods currentMethodToLaunch**) { new Thread(){ public void run() { // **w

使用Java,有没有一种方法可以引用一个方法并动态地生成一个线程

例如,如果您有一个名为
spawn()
的方法,它将接受另一个方法引用的参数,然后它将派生出一个线程,该线程将运行引用的方法。我想代码应该是这样的:

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

为了使上述方法有效,我想我需要能够引用一种
方法
。如果这不可能,为什么会这样?

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

但是,这种一般行为可以通过
ExecutorService
Runnable
/
Callable
s来实现

请看一看java文档

编辑


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

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

但是,这种一般行为可以通过
ExecutorService
Runnable
/
Callable
s来实现

请看一看java文档

编辑


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

可以将实现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
  }
} 

在Java8之前,接口用于“传递方法”,如上所述。有了Java8,就有了Lambda表达式,可以更好地模拟这种行为

可以将实现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
  }
} 

在Java8之前,接口用于“传递方法”,如上所述。有了Java8,就有了Lambda表达式,可以更好地模拟这种行为

如其他答案所示,您可能只想传入
Runnable
s或
Callable
s,并将其用作执行方法的基础

但是,如果确实希望传递方法,则可以使用来完成此任务。这有点麻烦,但肯定是可行的

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()
}

正如其他答案所指出的,您可能只想传入
Runnable
s或
Callable
s,并将它们用作执行该方法的基础

但是,如果确实希望传递方法,则可以使用来完成此任务。这有点麻烦,但肯定是可行的

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()
}

您要做的是,需要将函数/方法视为语言中的第一类对象。这意味着您可以声明一个函数并将其作为参数传递给另一个函数。Java不支持这个。但是,在Java8中,您可以通过lambda表达式传递函数的内联体:您要做的是,需要将函数/方法视为语言中的第一类对象。这意味着您可以声明一个函数并将其作为参数传递给另一个函数。Java不支持这个。但是,在Java8中,您可以通过lambda表达式传递函数的内联体:我要注意的是,有一种方法只会产生数量可能无限的匿名线程,并在运行时释放它们。您真的应该使用executor服务来跟踪它们,它使正常关机更加简单。@Aurand-这是一个完全不同的考虑,OP不一定会询问。您是使用executor服务还是使用单个线程取决于许多因素。如果不确切知道它的用途,那么将其声明为最适合executor服务的任务将是非常不成熟的。另外,OP运行的是一个线程,所以我尽量让它与他的代码相似。我要注意的是,有一种方法可能会产生无限数量的匿名线程,并在运行时释放它们。您真的应该使用executor服务来跟踪它们,它使正常关机更加简单。@Aurand-这是一个完全不同的考虑,OP不一定会询问。您是使用executor服务还是使用单个线程取决于许多因素。如果不确切知道它的用途,那么将其声明为最适合executor服务的任务将是非常不成熟的。另外,OP运行的是一个线程,所以我尽量让它与他的代码相似。从技术上讲,这相当于传递此方法所属对象的实例并调用它。他的问题更多地暗示了传递函数的可能性,而不必将函数绑定到类,就像在纯函数语言或对函数范式有良好支持的语言中一样。从技术上讲,这相当于传递此方法所属对象的实例并调用它。他的问题更多地暗示了传递函数的可能性,而不必将它们绑定到类,就像在纯函数语言或对函数范式有良好支持的语言中一样。