Java动态方法线程生成
使用Java,有没有一种方法可以引用一个方法并动态地生成一个线程 例如,如果您有一个名为Java动态方法线程生成,java,multithreading,methods,Java,Multithreading,Methods,使用Java,有没有一种方法可以引用一个方法并动态地生成一个线程 例如,如果您有一个名为spawn()的方法,它将接受另一个方法引用的参数,然后它将派生出一个线程,该线程将运行引用的方法。我想代码应该是这样的: void spawn(**wayToReferenceANumberOfDifferentMethods currentMethodToLaunch**) { new Thread(){ public void run() { // **w
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运行的是一个线程,所以我尽量让它与他的代码相似。从技术上讲,这相当于传递此方法所属对象的实例并调用它。他的问题更多地暗示了传递函数的可能性,而不必将函数绑定到类,就像在纯函数语言或对函数范式有良好支持的语言中一样。从技术上讲,这相当于传递此方法所属对象的实例并调用它。他的问题更多地暗示了传递函数的可能性,而不必将它们绑定到类,就像在纯函数语言或对函数范式有良好支持的语言中一样。