使用Java,有没有办法引用一个方法并动态生成一个线程?
例如,如果你有一个名为spawn()
的方法,它将获取另一个方法引用的参数,然后它将产生一个运行引用方法的线程。我想代码看起来像是:
void spawn(**wayToReferenceANumberOfDifferentMethods currentMethodToLaunch**) {
new Thread(){
public void run() {
// **way to launch the currentMethodToLaunch**
}
}.start();
}
为了使上述工作正常,我想我需要能够引用一种method
。如果这不可能,为什么会这样呢?
答案 0 :(得分:5)
严格来说?不.Java不是一种函数式语言,方法不是对象,也不能作为参数传递。
但是,这种一般行为可以通过ExecutorService
和Runnable
/ 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)
正如其他答案所示,您可能只想传入Runnable
或Callable
并使用这些作为执行方法的基础。
但是,如果你真的想要传递方法,那么你可以使用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()
}