所以我在这里有这个代码,它将我的“NamePrinter”runnable类添加为ExecutorService任务。一切都很好,但我想摆脱额外的课程。所以我想问有没有办法向ExexutorService提交方法?
以下是我目前的代码:
public void start(){
Collection<Future<?>> futures = new LinkedList<>();
final ExecutorService es = Executors.newFixedThreadPool(poolSize);
for (int i = 0; i < 10; i++) {
futures.add(es.submit(new NamePrinter(name)));
}
es.shutdown();
}
但我希望它是这样的:
public void start(){
Collection<Future<?>> futures = new LinkedList<>();
final ExecutorService es = Executors.newFixedThreadPool(poolSize);
for (int i = 0; i < 10; i++) {
futures.add(es.submit(namePrint(i+"name"))); // This code doesn't work, I just made it so you could understand what I mean.
}
es.shutdown();
}
public void namePrint(String name){ // I'd like this to be the task that ExecutorService runs.
System.out.println(name);
}
这是可以实现的吗?
答案 0 :(得分:5)
你最接近的是一个匿名的内部阶级:
for (int i = 0; i < 10; i++) {
final int x = i;
futures.add(es.submit(new Runnable() {
@Override public void run() {
namePrint(x + "name");
}
}));
}
答案 1 :(得分:3)
您实际上是在问:是Java支持函数作为一等公民(有时它被称为 closures 或 lambdas ) - 不, 你不能用Java做到这一点。您可以使用Groovy,Scala,JavaScript,C#......但不能使用Java。
您的NamePrinter
类(可能实现Runnable
或Callable
)是您可以在Java中获得的最接近的,这是Java方式(或者您可以使用匿名内部类)。 / p>
答案 2 :(得分:1)
在这种特定情况下,我认为您无法完全您想要的内容,因为run
界面的Runnable
方法并不是&#39 ; t采取任何论点。但是,您可以使用 lambda表达式,因为 Java 8 。所以你现在几乎没有选择:
1 - 即时定义方法
final String name = "whatever";
exServ.execute(() -> {
System.out.println(name);
});
2 - 定义静态方法,然后使用静态方法引用
public static void printName()
{
System.out.println(ClassNameX.name);
}
exServ.execute(ClassTest::printName);
3 - 创建NamePrinter类的实例 - 它不需要实现Runnable
接口 - 来存储参数,然后使用实例方法引用。
NamePrinter np = new NamePrinter("testName");
exServ.execute(np::namePrint);
答案 3 :(得分:0)