Callable

■コード

package hello.java.util.concurrent;

import java.util.ArrayList;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

public class CallableTestMain implements Callable<String> {

private String input;

public CallableTestMain(String input) {

this.input = input;

}

public String call() throws Exception {

// <処理>

String output = "output=" + input + "+" + input + ",threadid="

+ Thread.currentThread().getId();

Thread.sleep(100);

// </処理>

return output;

}

public static void main(String[] args) {

// タスク

String[] taskInput = new String[10];

{

for (int idx = 0; idx < 10; idx++) {

taskInput[idx] = "" + idx;

}

}

final int nThreads = 3;

ExecutorService executor = Executors.newFixedThreadPool(nThreads);

ArrayList<Future<String>> futures = new ArrayList<Future<String>>();

long time1 = System.nanoTime();

for (String task : taskInput) {

futures.add(executor.submit(new CallableTestMain(task)));

}

executor.shutdown();

for (Future<String> future : futures) {

try {

// 処理結果取得

String output = future.get();

System.out.println(output);

} catch (InterruptedException e) {

e.printStackTrace();

Thread.currentThread().interrupt();

continue;

} catch (ExecutionException e) {

e.printStackTrace();

continue;

}

}

long time2 = System.nanoTime();

System.out.println("time:" + (time2 - time1) + "ns");

System.out.println("time:" + (time2 - time1) / (1000 * 1000) + "ms");

}

}

■結果

output=0+0,threadid=8

output=1+1,threadid=9

output=2+2,threadid=10

output=3+3,threadid=8

output=4+4,threadid=10

output=5+5,threadid=9

output=6+6,threadid=8

output=7+7,threadid=9

output=8+8,threadid=10

output=9+9,threadid=8

time:402698108ns

time:402ms

■解説

最大3つのスレッド(ID=8,9,10)を使って各処理が実行されていることがわかる。

処理時間は1スレッドで実行すれば1000msかかるところが、100ms*3+100ms=400ms で処理できている。

Java6 is good.

tags

---

Java マルチスレッド