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 マルチスレッド