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はファーストクラスシチズンとして関数をサポートしていますか(クロージャまたはラムダと呼ばれることもあります)-いいえ、Javaではこれを行うことはできません。Groovy、Scala、JavaScript、C#...で使用できますが、Javaでは使用できません。

あなたのNamePrinterクラス(おそらく実装RunnableまたはCallable)はJavaで取得できる最も近いものであり、これはJavaの方法です(または匿名の内部クラスを使用できます)。

于 2012-07-24T14:22:28.127 に答える
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 に答える