将方法提交到ExecutorService Java

时间:2012-07-24 14:20:14

标签: java methods executorservice

所以我在这里有这个代码,它将我的“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);

}

这是可以实现的吗?

4 个答案:

答案 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类(可能实现RunnableCallable)是您可以在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)

有一些选择:

  1. 使用匿名类

    es.submit { new Runnable() {
     public void run() {
      //do your stuff here
     }
    });
    
  2. 使用支持Scala等闭包的语言。但是,API必须支持这一点,而ExecutorService则不支持。

  3. 等待Java 8,这会引入闭包。