3

所以我在这里有这段代码,它将我的“NamePrinter”可运行类添加为 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

4 回答 4

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");
        }
    }));
}
于 2012-07-24T14:22:40.257 回答
3

您本质上是在问:Java 是否支持作为一等公民的函数(有时它被称为闭包lambdas)-不,您不能在 Java 中这样做。您可以在 Groovy、Scala、JavaScript、C#... 中使用,但在 Java 中则不行。

您的NamePrinter类(可能实现Runnableor Callable)是您可以在 Java 中获得的最接近的类,这是 Java 方式(或者您可以使用匿名内部类)。

于 2012-07-24T14:22:28.127 回答
2

在这种特定情况下,我认为您将无法完全按照您的意愿行事,因为 interface 的run方法Runnable不接受任何参数。但是,您可以从Java 8开始使用lambda 表达式。所以你现在有几个选择:

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);
于 2015-04-13T05:34:50.057 回答
0

有一些选项:

  1. 使用匿名类

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

  3. 等待将引入闭包的Java 8 。

于 2012-07-24T15:00:44.523 回答