2

我正在尝试编写一个方法,该方法采用 Runnable 类的构造函数并根据输入的构造函数以某种方式运行它。

所以我希望能够做这样的事情:

executeInParallel(someRunnable::new)
executeInParallel(someOtherRunnable::new)

我的问题是如何定义executeInParallel方法以便能够传递我在参数中定义的任何 Runnable 构造函数?基本上我的问题是为了做到这一点,我该如何定义这种方法? void executeInParallel(??){ ... }

似乎我只能将遵循功能接口的方法作为参数,所以我不能executeInParallel用一个接受多个xRunnable::new构造函数的参数来定义有没有办法让我在不使用某种工厂的情况下做到这一点图案?

我想明确说明我想这样做的原因是我想传入构造函数而不是实例。我无法在 executeInParallel 之外生成实例,它必须在该方法内生成。我还想传入采用不同参数的不同构造函数

先感谢您

编辑 对不起,我希望这个问题更清楚一点。

4

1 回答 1

5

您的executeInParallel()方法接受将生成 Runnable 的内容,因此其签名应该是executeInParallel(Supplier<? extends Runnable> runnableFactory)

然后,您可以使用任何可以返回任何实现的类的实例的 lambda 或方法引用来调用它Runnable

可能的用途:

// Ex 1 :
class MyJob implements Runnable { 
    public void run() {...} 
}
executeInParallel(() -> new MyJob());
executeInParallel(MyJob::new);

 

// Ex 2 :
class MyJobWithParams implements Runnable {
    public MyJobWithParams(String param1, int param2) { ... }
    public void run() {...} 
}
executeInParallel( () -> new MyJobWithParams("Hello",42) );
// You cannot use method references here

 

// Ex 3 : 
class RunnableFactory {
    public static Runnable makeRunnable() {
        return new MyJob(); // which is a Runnable, see above
    }
}
executeInParallel( () -> RunnableFactory.makeRunnable() );
executeInParallel( RunnableFactory::makeRunnable );

此外,您声明您只希望将 Runnable 构造函数传递给该方法。这可以通过方法引用(但仅适用于无参数构造函数)或 lambda 表达式(如上面的示例 #1 和 #2)来完成。

于 2016-06-04T23:46:16.957 回答